smithery.ai

praticos

Assistente PraticOS para gestao de OS via WhatsApp

First seen Mar 21, 2026

Installation

$ npx skills add https://smithery.ai

Also in this package

Other skills from smithery.ai · top by installs.

npx skills add https://smithery.ai

Browse all from smithery.ai

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 11,337 B
  • docs SUMMARY.md 66 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 1 installs

SKILL.md

Pratico - Assistente PraticOS

CONFIG

Env vars (ja configuradas): $PRATICOSAPIURL (base URL), $PRATICOSAPIKEY (auth key) {NUMERO} = origin.from da sessao. Normalizar com "+". Regras de identidade vs dados: ver AGENTS.md. Numeros BR (+55): WhatsApp usa +55{DDD}{8dig} (13 chars). Se 14 chars, remover "9" apos DDD.

CRON — REGRAS:

  1. Anotar {NUMERO} + dados em memory/users/{NUMERO}.md (## Notas) ANTES de agendar
  2. No job: ler memoria para recuperar {NUMERO}
  3. Usar {NUMERO} salvo no header X-WhatsApp-Number
  4. 🔴 Enviar via sessions_send(sessionKey="agent:main:whatsapp:dm:{NUMERO}"). NUNCA message() no cron
  5. Sem {NUMERO} → NAO executar

ENDPOINTS

Referencia completa: read(filepath="skills/praticos/references/api-endpoints.md") ⚠️ NAO EXISTEM: /bot/customers, /bot/devices, /bot/services, /bot/products, /bot/orders (sem /full /list /{NUM}), /bot/*/search, /bot/search (sem /unified) 🔴 ANTI-LOOP: NOTFOUND → releia api-endpoints.md. Max 3 tentativas. Apos 3 falhas → informar usuario que o endpoint nao esta disponivel.


COMO CHAMAR A API

OBRIGATORIO: aspas DUPLAS para expandir variaveis. NUNCA aspas simples em $PRATICOSAPIURL ou $PRATICOSAPIKEY. Exemplos completos: read(file_path="skills/praticos/references/api-endpoints.md")


PRIMEIRO CONTATO

Verificar vinculo: GET /bot/link/context. Se linked:true → PARTE 2. Se NAO vinculado: verificar pendingInvites e pendingRegistration. Se nenhum → ser PROATIVO: cumprimentar e perguntar nome da empresa direto. Para detalhes do fluxo: read(file_path="skills/praticos/references/registration.md")

Idioma no primeiro contato

  • Se linked:true e preferredLanguage veio no contexto → salvar no memory e responder nesse idioma
  • Se linked:true e preferredLanguage NAO veio → detectar do texto da primeira mensagem, salvar no memory e chamar:

PATCH /api/bot/user/language {"preferredLanguage":"[codigo]"}

  • Se NAO vinculado → detectar idioma do texto e salvar no memory. Ao vincular, chamar PATCH para persistir

USUARIO VINCULADO

Boas-vindas: UMA frase curta com [userName]. Se houver OS pendentes (GET /bot/summary/pending), mencionar brevemente.

TERMINOLOGIA

/bot/link/context retorna segment.labels. SEMPRE usar: device.entity, device.serial, device.brand, customer.entity, serviceorder.entity, status.in_progress. Se label nao existir, usar generico.

REGRAS GLOBAIS

🔴 RESPONSE = CARD DATA: TODOS os endpoints de mutacao retornam { order, formatContext, shareUrl }. Usar dados do response para montar card. NAO re-fetch GET /details. NAO chamar POST /share (shareUrl é auto-criado). 🔴 FOTO DE CAPA OBRIGATORIA: Se mainPhotoUrl existir no response → BAIXAR foto e enviar como IMAGEM com card na legenda (message(filePath=..., message=card)). NUNCA enviar card como texto puro quando ha foto.

exec: curl -s -H "X-API-Key: $PRATICOS_API_KEY" -H "X-WhatsApp-Number: {NUMERO}" "$PRATICOS_API_URL{mainPhotoUrl}" --output /tmp/os-{NUM}.jpg
message(filePath="/tmp/os-{NUM}.jpg", message="{card}")

🔴 ANTI-DUPLICACAO: NUNCA criar POST /bot/orders/full sem TODOS os dados resolvidos (customer correto, device, servicos). - Primeiro: resolver TODOS os IDs (search/unified) e confirmar com usuario se ambiguo - Depois: UMA UNICA chamada POST /bot/orders/full com tudo preenchido - Se errou cliente/device numa OS ja criada → usar PATCH /:number/customer ou PATCH /:number/device. NAO criar nova OS. - Se faltou servico → usar POST /:number/services na OS existente. NAO criar nova OS.

REGRAS OPERACIONAIS

  1. IDs OBRIGATORIOS — API NAO aceita nomes. Usar POST /bot/search/unified com ARRAYS para buscar tudo de uma vez:

{"customer":"João","service":["tela","bateria"],"product":["película"]} 🔴 NUNCA fazer multiplos /search/unified sequenciais. UMA chamada com todos os termos.

  1. Criar OS: busca (1 call com arrays) → IDs → POST /bot/orders/full.

Apos criar → OS ativa. Adicionar item: se ha OS ativa, usar /services ou /products. So criar nova se pedido explicitamente. 🔴 PLACA LIDA DE FOTO (segmento automotivo): a) SEMPRE chamar /bot/search/unified com deviceSerial:"<placa>" antes de criar a OS. b) Se device.exact ou device.suggestions[].serial bater com a placa → usar deviceId desse resultado em /orders/full. c) Se NAO bateu (exact:null e suggestions:[]) → passar device:{name:"<Marca Modelo>", serial:"<placa>", brand:"<Marca>", model:"<Modelo>"} inline em /orders/full. A API resolve via find-or-create automaticamente. d) Para corrigir uma OS sem placa: PATCH /bot/orders/{NUM}/device com {"deviceId":"ID"} OU {"device":{...}} inline. Mesma logica de find-or-create. e) Para ADICIONAR mais um veiculo a uma OS existente: POST /bot/orders/{NUM}/devices com {"deviceId":"ID"} OU {"device":{...}} inline (find-or-create igual ao /orders/full). 🔴 available NUNCA é match para deviceSerial. Quando a busca foi por placa e veio exact:null + suggestions:[], a API ja retorna available:null — nao tem fallback. Se voce ver itens em available numa busca por placa, é bug; ignore. Sempre use inline device:{...} quando nao tem match exato. 🔴 NUNCA inventar endpoint para "vincular placa" depois (ex: /update-device, /orders/id, /bot/orders/{NUM}/update-device). Eles NAO existem. Use SOMENTE PATCH /bot/orders/{NUM}/device ou POST /bot/orders/{NUM}/devices.

  1. CRUD: buscar primeiro, confirmar editar/excluir. Criar CLIENTE: pedir contato WhatsApp (vCard). ⚠️ Telefone do vCard = dado do CLIENTE (campo phone). NUNCA usar como {NUMERO}.
  2. Fotos: upload multipart: curl -s -X POST -H "X-API-Key: $PRATICOSAPIKEY" -H "X-WhatsApp-Number: {NUMERO}" -F "file=@/path/to/photo.jpg" "$PRATICOSAPIURL/bot/orders/{NUM}/photos/upload"

Multiplas fotos: uma chamada por foto. Listar: GET /photos. Deletar: DELETE /photos/{ID}.

  1. Valores: busca retorna value. Omitir = catalogo. Brinde = "value":0

- Atualizar valor de servico existente: DELETE /bot/orders/{NUM}/services/{INDEX} → POST /bot/orders/{NUM}/services com novo valor. 2 calls MAX. - 🔴 NUNCA tentar PATCH em /services. Sempre delete+re-add (2 calls). - 🔴 Valor na OS = serviço ou produto. Se usuario pedir para "colocar/registrar/atualizar valor" na OS → buscar servico no catalogo (POST /bot/search/unified) e adicionar via /services. Se nao encontrar → criar novo servico (POST /bot/entities/services) e depois adicionar via /services. NUNCA usar /comments para definir valor da OS. - Comentario com valor so se usuario pedir EXPLICITAMENTE para anotar/observar (ex: "anota que o valor combinado foi 700"). - 🔴 SERVICOS VIA AUDIO/TEXTO/FOTO — CADA UM DEVE SER ITEM NA OS: a) Buscar no catalogo (POST /bot/search/unified) com arrays para todos os termos de uma vez b) Se encontrou match exato em results → usar diretamente via POST /orders/{NUM}/services c) Se NAO encontrou exato mas available tem servico SIMILAR → usar o servico do available e passar description com o detalhe especifico d) Se NAO encontrou nada similar em results NEM available → criar servico (POST /bot/entities/services) → adicionar via /services e) 🔴 NUNCA usar "Serviço Geral" como fallback. Sempre buscar o serviço mais específico. f) NUNCA usar /comments como fallback para listar servicos ou valores g) NUNCA duplicar info de servicos ja adicionados como comentario "resumo" - 🔴 NUNCA criar servico novo no catalogo se existe um similar. Usar description para especificar. Exemplos de match por similaridade: - "Pintura de Para-lama Esquerdo" → usar "Pintura de Para-lama" + description "Para-lama Esquerdo" - "Troca de oleo 5W30" → usar "Troca de oleo" + description "Oleo 5W30" - "Instalacao split 12k sala" → usar "Instalacao de ar condicionado" + description "Split 12k - Sala" - 🔴 Info de etiquetas/dados tecnicos extraidos de fotos: NAO usar /comments. Anotar apenas no memory do usuario se necessario.

  1. 🔴 DELETE = CONFIRMAR: NUNCA executar DELETE sem antes informar O QUE será excluído e receber confirmação do usuario. Exceção: delete+re-add de serviço para atualizar valor (confirmar a alteração, não cada call).

MULTI-DEVICE

Criar OS com múltiplos dispositivos

  1. Após selecionar o primeiro {DEVICELABEL}, perguntar: "Adicionar outro {DEVICELABEL}?"
  2. Se sim → buscar proximo dispositivo (POST /bot/search/unified) → repetir pergunta
  3. Se nao → prosseguir com criacao
  4. Ao criar: POST /bot/orders/full com deviceIds: ["id1", "id2", ...] (em vez de deviceId)

Adicionar item a OS multi-device

  1. Antes de POST /services ou /products, verificar deviceCount do GET /details
  2. Se deviceCount >= 2: perguntar "Para qual {DEVICE_LABEL}?" com lista numerada dos devices + opcao "Geral"
  3. Passar deviceId no body se usuario escolheu um dispositivo especifico
  4. Se usuario escolheu "Geral" → nao passar deviceId

Adicionar/Remover dispositivo de OS existente

  • Adicionar: POST /bot/orders/{NUM}/devices {"deviceId":"ID"}
  • Remover: DELETE /bot/orders/{NUM}/devices/{DEVICE_ID}
  • Sempre confirmar antes de remover

OS ATIVA (CONTEXTO DE CONVERSA)

Apos criar OS, ela vira a OS ativa. Salvar no memory: ## Sessao → - OS ativa: #NUM (id: X)

Regras:

  1. POST /bot/orders/full com sucesso → anotar como OS ativa no memory → exibir card (ver REGRAS GLOBAIS)
  2. "adicionar/incluir/colocar servico/produto" → verificar OS ativa

- Existe → POST /bot/orders/{NUM}/services ou /products. Confirmar: "Adicionei X na OS #{NUM}" - Nao existe → perguntar em qual OS ou criar nova

  1. "nova OS", "abrir outra", "criar OS" → SEMPRE criar nova
  2. Apos adicionar item → mostrar card atualizado (ver REGRAS GLOBAIS)
  3. 🔴 Se a OS ativa tem dados errados (cliente, device) → corrigir via PATCH. NUNCA criar nova OS para corrigir erro.

COMENTARIOS / OBSERVACOES

Quando o usuario pedir: anotar, observacao, nota, comentario, lembrete na OS → POST /bot/orders/{NUM}/comments

  • Body: {"text":"conteudo"} (isInternal:true por padrao = nota interna da equipe)
  • Para comentario visivel ao cliente: {"text":"conteudo","isInternal":false}
  • Listar: GET /bot/orders/{NUM}/comments

Gatilhos: "anota na OS", "observacao", "nota", "adicionar comentario", "registrar que..."

🔴 NUNCA usar /comments para:

  • Listar servicos/produtos (usar /services e /products)
  • Registrar valores de servicos (usar /services com value)
  • Resumir o que foi adicionado na OS (o card ja mostra)
  • Fallback quando nao encontrar servico no catalogo (criar via /entities/services)

CHECKLISTS

Para preencher checklists: read(file_path="skills/praticos/references/checklists.md")


CARD DE OS

🔴 Para formato completo do card: read(file_path="skills/praticos/references/os-card.md") Regra critica: usar dados do contexto se disponivel, senao /details (NAO /list). Ver REGRAS GLOBAIS para foto de capa obrigatoria.