Comandos Serverless · Desenvolvedores
Escreva e execute código JavaScript serverless diretamente no Dailybot. Construa comandos personalizados sem implantar infraestrutura própria.
Comandos de Código Serverless
Os comandos de código serverless permitem que você escreva e execute código JavaScript diretamente dentro do Dailybot — sem necessidade de infraestrutura de servidor. Seu código roda no ambiente seguro do Dailybot e pode fazer requisições HTTP, acessar armazenamento persistente e retornar respostas interativas.
Executar um Comando
Os comandos serverless podem ser disparados de três formas:
- Disparo no Chat — Os usuários digitam o comando diretamente em DMs ou canais
- Disparo por Workflow — O código roda em resposta a eventos ou agendamentos via Workflows do Dailybot
- Agendador de Comandos — Use o SDK do Dailybot para agendar uma execução futura do comando
Entrada do Comando
Quando um comando é disparado, seu código recebe um objetoevent com contexto sobre a execução.
Query String
O texto adicional digitado após o nome do comando fica disponível como event.query. Por exemplo, digitar/growth_rate Julho, Agosto torna "Julho, Agosto"disponível via event.query.
Variáveis de Contexto
event.data.intent— O nome do comando disparadoevent.data.user_full_name— Nome do usuário que disparou o comandoevent.data.targetChannel— Objeto do canal de chat onde o comando foi executado
// Fazer parse da entrada do query string
let query = event.query;
let month = null;
if (query) {
let parts = query.split(" ");
if (parts[0]) {
month = parts[0];
}
}
return `Gerando relatório para ${month || 'este mês'}...`;Usar Código Serverless em Workflows
Quando o mesmo código roda como um passo dentro de umWorkflow (Automação) do Dailybot, o contexto de execução é diferente do de um comando de chat. Em vez dos campos do event de chat, seu código lê os dados da automação através de um objetoworkflow.
workflow.prev_step— Dados retornados pelo passo anterior (ex.workflow.prev_step.result,workflow.prev_step.ai_response)workflow.action1…workflow.actionN— Dados retornados por um passo em uma posição específica (ex.workflow.action1.result)workflow.context— Metadados desta execução (workflow_uuid,workflow_name,organization_uuid, …)
O valor que você devolver com return viraprev_step.result (e actionN.result) para os passos seguintes.
// Ler a saída dos passos anteriores e passar um valor adiante
const previous = workflow.prev_step.result;
const aiText = workflow.action1.ai_response;
return `O passo anterior disse: ${previous}`;Info
automation — sempre leia os dados dos passos através de workflow. Dentro de um workflow, o armazenamento do DailybotSDK fica automaticamente no escopo do workflow, então você não precisa chamarsetAPIKey.Fazendo Requisições HTTP
A variável request está disponível no seu código e encapsula a bibliotecasuperagentpara fazer requisições HTTP.
// Requisição GET
const response = await request.get('https://api.example.com/data');
const data = response.body;
// Requisição POST com corpo JSON
const response = await request
.post('https://api.example.com/submit')
.send({ name: 'Dailybot', type: 'automation' })
.set('Authorization', 'Bearer your-token');Retornar Resultados
Resposta String
Retorne uma string simples para exibir como resposta do comando:
return "Olá mundo!";Resposta JSON com Botões Interativos
Retorne um objeto JSON com uma mensagem e botões interativos:
return {
"message": "As vendas da semana passada aumentaram 15% 📈",
"buttons": [
{
"label": "Mês passado",
"label_after_click": "Buscando vendas do mês passado...",
"value": "sales last month",
"button_type": "Command"
},
{
"label": "Trimestre passado",
"label_after_click": "Buscando relatório trimestral...",
"value": "sales last quarter",
"button_type": "Command"
}
]
};Tip
Dailybot SDK
O objeto DailybotSDK está disponível no seu código e fornece acesso a armazenamento persistente chave-valor.
Inicialização
DailybotSDK.setAPIKey("sua_api_key");Armazenamento Chave-Valor
Armazene objetos JSON em chaves no escopo do usuário. Os dados são associados ao usuário que fez a requisição.
// Gravar dados
await DailybotSDK.Storage.write('preferences', {
theme: 'dark',
notifications: true
});
// Ler dados
let prefs = await DailybotSDK.Storage.read('preferences');
// prefs = { theme: 'dark', notifications: true }
// Deletar dados
await DailybotSDK.Storage.delete('preferences');Exemplos
Reserva de Sala de Reuniões
// Uso: /book-room conference-a 2026-02-15 14:00
const parts = event.query.split(" ");
const roomName = parts[0];
const date = parts[1];
const time = parts[2];
if (!roomName || !date || !time) {
return "Uso: /book-room <nome-sala> <data> <hora>";
}
// Reservar a sala via API externa
const response = await request
.post('https://rooms.company.com/api/book')
.send({ room: roomName, date, time });
return `Sala ${roomName} reservada em ${date} às ${time}. Confirmação: ${response.body.id}`;Buscador de Notícias Tech
// Buscar as últimas manchetes tech
try {
const response = await request
.get('https://newsapi.org/v2/top-headlines')
.query({ category: 'technology', pageSize: 5, apiKey: 'your_api_key' });
const headlines = response.body.articles
.map((a, i) => `${i + 1}. ${a.title}`)
.join('\n');
return `Manchetes Tech de Hoje:\n${headlines}`;
} catch (error) {
return "Não foi possível obter as notícias. Tente novamente mais tarde.";
}Padrões Avançados
- Use o armazenamento do SDK para construir fluxos com estado entre múltiplas invocações
- Faça parse de
event.querypara aceitar subcomandos (ex.,/tool help,/tool status) - Encadeie comandos usando botões interativos para processos de múltiplos passos
- Trate erros com elegância e retorne mensagens úteis aos usuários
- Use o agendador para configurar busca recorrente de dados ou relatórios