Toda segunda-feira às 09:00 em Tóquio, leia os números da semana passada na sua API de análises, escreva um relatório curto e envie-o ao Slack ou por e-mail. O agente lê por meio de uma conexão que permite apenas GET, então ele pode olhar os seus números, mas não consegue alterá-los.
A execução leva cerca de 10 segundos. A maior parte do custo é a computação, cobrada a $0.0002 por segundo, então quatro execuções por mês custam cerca de um centavo. A parte do modelo depende do modelo que você escolher; leia cost_micros nas primeiras execuções para ver quanto é.
Reúna o que você precisa
- Uma chave de API com a função de administrador, porque só proprietários e administradores criam conexões e agendamentos. Veja funções e chaves.
- A sua API de análises via HTTPS e uma chave somente leitura para ela. Esta receita presume que ela tem
GET /metrics?period=…, em queperiodélast_weekou uma semana ISO como2026-W40. Ajuste os caminhos à sua API. - Uma URL de webhook de entrada do Slack, ou um endpoint seu que envie e-mails.
Crie a conexão somente leitura
A conexão mantém a chave da API dentro do Ephemeral e permite apenas
GET. Asinstructionsdizem ao agente o que a API oferece.curl -X PUT $EPHEMERAL_URL/v1/connections/analytics-api \ -H "Authorization: Bearer $EPHEMERAL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "type": "http", "url": "https://analytics.example.com/v2", "auth": { "type": "header", "header": "X-API-Key", "token": "an_live_…" }, "allowed_methods": ["GET"], "instructions": "GET /metrics?period=last_week or period=2026-W40 returns signups, active_users, revenue_cents and churned_accounts for that ISO week, with the same figures for the week before. Amounts are in cents." }'Salve o fluxo de trabalho
O prompt lê o período a partir da entrada da execução. O agente não tem um calendário confiável, então passe um período que a sua API consiga resolver, como
last_week, em vez de pedir ao agente que calcule as datas.curl -X PUT $EPHEMERAL_URL/v1/workflows/weekly-report \ -H "Authorization: Bearer $EPHEMERAL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "prompt": "Write the weekly business report for input.period. Call GET /metrics?period=<input.period> on the analytics connection and use only what it returns. Reply in Markdown, at most 150 words: a one-line headline, then signups, active users, revenue in dollars and churned accounts, each with the change from the week before. If the call fails, say so instead of estimating.", "connections": { "analytics": { "ref": "analytics-api", "allowed_methods": ["GET"] } }, "shell": false, "timeout_seconds": 120 }'Não há configuração de
web, então a execução não tem nenhum acesso à internet; o único alcance dela é a conexão de análises. Um fluxo de trabalho não pode guardarinput, um orçamento nem um callback; eles vêm com cada execução.Agende para a manhã de segunda-feira
0 9 * * 1é 09:00 nas segundas-feiras, lido notimezonedo agendamento. Oinputdo agendamento é o que toda execução iniciada por ele recebe, então é aqui que você define o período. Pré-visualize primeiro.curl -X POST $EPHEMERAL_URL/v1/schedules/preview \ -H "Authorization: Bearer $EPHEMERAL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "cron": "0 9 * * 1", "timezone": "Asia/Tokyo" }'Os horários estão em UTC: 00:00 UTC é 09:00 em Tóquio. Crie o agendamento:
curl -X POST $EPHEMERAL_URL/v1/schedules \ -H "Authorization: Bearer $EPHEMERAL_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "workflow": "weekly-report", "name": "Monday report", "cron": "0 9 * * 1", "timezone": "Asia/Tokyo", "input": { "period": "last_week" }, "max_cost_micros": 300000 }'O orçamento de $0.30 é reservado a cada início e liberado quando a execução é liquidada. Como o agendamento é dono da entrada, você pode adicionar outro agendamento ao mesmo fluxo de trabalho com uma entrada diferente, ou alterar este depois com
PATCH /v1/schedules/{id}e um novoinput. Para vê-lo funcionar antes de segunda-feira, inicie uma agora comPOST /v1/schedules/{id}/runouephemeral schedules run ID.Entregue o relatório
As execuções agendadas não enviam callbacks, então a entrega é feita coletando o resultado. Este script, executado a cada dez minutos pelo cron ou pelo CI, pede a execução bem-sucedida mais recente do agendamento, envia a saída dela uma única vez e memoriza o ID da execução. Troque a chamada ao Slack por uma chamada ao seu serviço de e-mail se preferir e-mail.
import { readFile, writeFile } from "node:fs/promises"; const { EPHEMERAL_URL, EPHEMERAL_API_KEY, SCHEDULE_ID, SLACK_WEBHOOK_URL } = process.env; const stateFile = "report-state.json"; const { sent } = JSON.parse(await readFile(stateFile, "utf8").catch(() => "{}")); const response = await fetch(`${EPHEMERAL_URL}/v1/runs?schedule=${SCHEDULE_ID}&status=succeeded&limit=1`, { headers: { Authorization: `Bearer ${EPHEMERAL_API_KEY}` }, }); if (!response.ok) throw new Error(`Ephemeral returned ${response.status}`); const [run] = (await response.json()).items; if (!run || run.id === sent) process.exit(0); // nothing new since the last report await fetch(SLACK_WEBHOOK_URL, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text: run.output }), }); await writeFile(stateFile, JSON.stringify({ sent: run.id }));Uma execução que falhou não envia nada, então olhe também
GET /v1/runs?schedule={id}&status=failed&limit=1, ou acompanhe olast_errordo agendamento, para que um relatório ausente não passe despercebido.Execute de novo um relatório de uma semana passada
"Iniciar agora" reutiliza a entrada do agendamento, então, para outra semana, inicie o fluxo de trabalho diretamente com o período que você quiser. Desta vez você pode pedir um callback assinado, que entrega o resultado ao seu endpoint assim que estiver pronto. Use uma chave de idempotência que nomeie a semana, para que uma requisição repetida nunca envie um segundo relatório.
curl $EPHEMERAL_URL/v1/runs \ -H "Authorization: Bearer $EPHEMERAL_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: weekly-report-2026-W38" \ -d '{ "workflow": "weekly-report", "input": { "period": "2026-W38" }, "max_cost_micros": 300000, "callback": { "url": "https://example.com/hooks/ephemeral", "secret": "'"$EPHEMERAL_CALLBACK_SECRET"'" } }'O seu endpoint de callback verifica a assinatura e encaminha
run.output; o receptor está em a receita de investigação de pagamento. Uma execução iniciada dessa forma não carrega o ID do agendamento, então não aparece em?schedule=.
Bom saber
| Tema | Comportamento |
|---|---|
| Fuso horário | Os horários são lidos no fuso do agendamento (timezone), então um relatório marcado para 09:00 continua às 09:00 no horário local mesmo com mudanças de horário de verão. |
| Inícios perdidos | Se o Ephemeral estava indisponível às 09:00, o relatório é executado uma vez quando ele voltar, e depois a programação continua. |
| Sobreposição | Com skip_if_running ativado, um início é ignorado enquanto a execução anterior ainda está em andamento. |
| Pausando | ephemeral schedules pause ID antes de um feriado e resume depois. |
GET, e a chave nunca chega à microVM. O fluxo de trabalho não tem acesso à web nem shell, então a execução pode ler a sua API de análises e mais nada. O orçamento limita cada execução a $0.30. Use uma chave de análises somente leitura, para que nem a conexão pudesse escrever.