用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/majiayu000/claude-skill-registry --skill whatsapp-flows命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
LLM token logprobs and calibration. Per-decision confidence, ECE, Brier, reliability diagrams, low-confidence triage.
Analyze LLM token logprobs and calibration. Use for per-decision confidence, ECE, Brier scores, reliability diagrams, and low-confidence triage.
回顾最近 N 天的 Claude Code 使用记录——扫描原始会话数据,按主题分组汇总"我都做了什么",并从个人操作系统视角输出模式、风险与增删建议。当用户说 /recap、"看看我这几天做了什么"、"回顾一下我最近的会话"、"这两天我用 claude 干了啥"、"活动回顾" 时使用。
基于 SOC 职业分类
正在显示 SKILL.md
| name | whatsapp-flows |
| description | Fluxos conversacionais WhatsApp |
Desenvolvimento de fluxos interativos para o WhatsApp Business API via Twilio, o canal mais inclusivo do Brasil.
backend/app/routers/webhook.pyCidadão (WhatsApp) → Twilio → POST /api/v1/webhook/whatsapp/chat → TaNaMaoAgent → Resposta
Olá! Sou o assistente do Tá na Mão.
Posso te ajudar com:
1️⃣ Ver meus benefícios
2️⃣ Documentos que preciso
3️⃣ Achar CRAS perto de mim
4️⃣ Dinheiro esquecido
5️⃣ Farmácia Popular
Manda o número da opção!
Para consultar seus benefícios, preciso do seu CPF.
Pode mandar aqui que é seguro. Só uso pra consultar, não guardo.
(Manda só os 11 números)
{{nome}}, achei seus dados!
✅ Bolsa Família: R$ {{valor}}/mês
📋 CadÚnico: Atualizado até {{data}}
Quer saber de mais benefícios que você pode ter direito?
Manda SIM ou NÃO.
Para pedir {{beneficio}}, leve ao CRAS:
📄 CPF de todos da família
📄 Certidão de nascimento ou casamento
📄 Comprovante de onde mora
📄 Carteira de trabalho
📄 Comprovante de renda (se tiver)
O CRAS mais perto de você fica em:
📍 {{endereco_cras}}
📞 {{telefone_cras}}
⚠️ {{nome}}, seu CadÚnico precisa ser atualizado!
Se não atualizar até {{data_limite}}, seus benefícios podem ser suspensos.
Leve seus documentos ao CRAS:
📍 {{endereco_cras}}
Horário: {{horario_funcionamento}}
# backend/app/agent/whatsapp/flows/consulta_beneficio.py
FLOW_CONSULTA = {
"inicio": {
"mensagem": "Vou consultar seus benefícios. Manda seu CPF (só números).",
"espera": "cpf",
"proximo": "validar_cpf"
},
"validar_cpf": {
"acao": "validar_cpf_tool",
"sucesso": "consultar",
"erro": {
"mensagem": "CPF inválido. Confere e manda de novo (11 números).",
"voltar": "inicio"
}
},
"consultar": {
"acao": "consultar_beneficio_tool",
"sucesso": "mostrar_resultado",
"erro": {
"mensagem": "Não consegui consultar agora. Tenta de novo em 5 minutos.",
"voltar": "fim"
}
},
"mostrar_resultado": {
"mensagem": "template_resultado",
"botoes": [
{"texto": "Ver mais benefícios", "proximo": "elegibilidade"},
{"texto": "Documentos necessários", "proximo": "checklist"},
{"texto": "Achar CRAS", "proximo": "buscar_cras"}
]
}
}
FLOW_CRAS = {
"inicio": {
"mensagem": "Manda sua localização 📍 ou seu CEP que acho o CRAS mais perto.",
"espera": "localizacao_ou_cep",
"proximo": "buscar"
},
"buscar": {
"acao": "buscar_cras_tool",
"sucesso": "mostrar_cras",
"erro": {
"mensagem": "Não achei CRAS perto. Manda outro CEP ou sua cidade.",
"voltar": "inicio"
}
},
"mostrar_cras": {
"mensagem": "template_cras_proximo",
"botoes": [
{"texto": "Ver no mapa", "acao": "enviar_localizacao"},
{"texto": "Ligar pro CRAS", "acao": "enviar_telefone"},
{"texto": "O que levar", "proximo": "checklist_cras"}
]
}
}
# backend/app/routers/webhook.py
@router.post("/whatsapp/chat")
async def whatsapp_webhook(request: Request):
form = await request.form()
from_number = form.get("From") # whatsapp:+5511999999999
body = form.get("Body", "").strip()
media_url = form.get("MediaUrl0") # foto de receita, etc.
latitude = form.get("Latitude")
longitude = form.get("Longitude")
# Recuperar sessão do Redis
session = await get_whatsapp_session(from_number)
# Processar pelo fluxo ativo ou agente
if session.active_flow:
response = await process_flow(session, body, media_url, latitude, longitude)
else:
response = await agent.process(body, session_id=from_number)
# Enviar resposta via Twilio
return await send_whatsapp_response(from_number, response)
# backend/app/services/whatsapp_service.py
from twilio.rest import Client
async def enviar_menu(to: str, texto: str, botoes: list[dict]):
"""Envia mensagem com botões interativos."""
client = Client(TWILIO_SID, TWILIO_TOKEN)
message = client.messages.create(
from_=f"whatsapp:{TWILIO_WHATSAPP_NUMBER}",
to=to,
body=texto,
# Botões interativos (máximo 3)
)
return message.sid
async def enviar_localizacao(to: str, lat: float, lng: float, nome: str):
"""Envia localização do CRAS/farmácia."""
client = Client(TWILIO_SID, TWILIO_TOKEN)
message = client.messages.create(
from_=f"whatsapp:{TWILIO_WHATSAPP_NUMBER}",
to=to,
body=f"📍 {nome}",
persistent_action=[f"geo:{lat},{lng}|{nome}"]
)
return message.sid
# Redis: sessão WhatsApp com TTL de 24h
async def get_whatsapp_session(phone: str) -> WhatsAppSession:
key = f"wa_session:{phone}"
data = await redis.get(key)
if data:
return WhatsAppSession.parse_raw(data)
session = WhatsAppSession(phone=phone)
await redis.setex(key, 86400, session.json())
return session
async def update_whatsapp_session(session: WhatsAppSession):
key = f"wa_session:{session.phone}"
await redis.setex(key, 86400, session.json())
# Limite: 1 mensagem por segundo por número, 1000/dia por número
WHATSAPP_RATE_LIMITS = {
"por_segundo": 1,
"por_dia": 1000,
"janela_conversa": 24 * 60 * 60, # 24h após última mensagem do usuário
}
backend/app/routers/webhook.py - Webhook principalbackend/app/services/whatsapp_service.py - Serviço de enviobackend/app/agent/whatsapp/flows/ - Fluxos conversacionaisbackend/app/agent/agent.py - Agente principalTWILIO_ACCOUNT_SID=ACxxxxx
TWILIO_AUTH_TOKEN=xxxxx
TWILIO_WHATSAPP_NUMBER=+14155238886
WHATSAPP_WEBHOOK_URL=https://api.tanamao.com.br/api/v1/webhook/whatsapp/chat
| Problema | Causa | Solução |
|---|---|---|
| Mensagem não chega | Janela de 24h expirou | Usar template aprovado pela Meta |
| Botões não aparecem | Formato incorreto | Verificar payload Twilio |
| Sessão perdida | Redis reiniciou | Tratar como nova conversa |
| Rate limit Twilio | Muitas mensagens | Implementar fila com backoff |