Lampson como motor
Sem interface: lampson run
O mesmo agente, sem terminal nem web: uma mensagem entra, a resposta sai. Para scripts, tarefas de cron, outros programas.
lampson run "resuma as mudanças de hoje" # a resposta pelo stdout
lampson run --agent plan "revise o último commit" # qualquer agente, integrado ou seu
echo "oi" | lampson run --agent tienda --thread cliente-42 # a mensagem também pode vir pelo stdin
lampson run --session 20261016-122626 "e os testes?" # continuar uma sessão conhecida
lampson run não inicia o hub nem o servidor web: prepara a pasta do projeto e roda o turno.
Opções§
| opção | |
|---|---|
--agent ID | o agente que responde (por padrão, build) |
--thread T | a identidade da conversa fora do Lampson: um telefone, um ticket, cto:tarea-17. Mesmo agente + mesmo thread = mesma conversa, com seu histórico |
--session ID | ou continuar uma sessão pelo id |
--json | cada passo como uma linha JSON (veja abaixo) |
--ask · --strict · --yolo | o modo de permissões; sem opção, o do agente, e se ele não definir, strict |
Sem ninguém por perto, o que pediria aprovação é negado: o modelo vê e explica na resposta.
Código de saída: 0 ok · 1 o turno terminou em erro · 2 uso inválido (agente inexistente, mensagem vazia).
--json: os eventos§
Uma linha JSON por evento. Primeiro session, depois o que o agente faz, e done no final:
{"kind": "session", "data": {"session": "20261016-125226-8941", "agent": "tienda", "thread": "cliente-42", "mode": "strict"}, "agent": "tienda", "thread": "cliente-42"}
{"kind": "tool_call", "data": {"name": "read", "args": {"path": ".lampson/tienda/catalogo.json"}}, "agent": "tienda", "thread": "cliente-42"}
{"kind": "tool_result", "data": {"call": {…}, "output": "…"}, "agent": "tienda", "thread": "cliente-42"}
{"kind": "assistant", "data": "Sim, temos pão integral a $3.200.", "agent": "tienda", "thread": "cliente-42"}
{"kind": "done", "data": {"agent": "tienda", "thread": "cliente-42", "session": "…", "text": "Sim, temos pão integral a $3.200.", "steps": 2, "usage": {"input": 1079, "output": 357, "cached": 448}, "stopped": "done"}, "agent": "tienda", "thread": "cliente-42"}
Os tipos de evento: session, assistant, tool_call, tool_result, tool_denied, usage, inbox, error, compact e done. Em done, stopped é done, max_steps, budget ou error: ….
--stdio: um processo aberto (modo local)§
lampson run --stdio fica aberto e atende muitos pedidos: um por linha no stdin, com um id seu. É o que o SDK usa no modo local — o Lampson dentro do seu programa, sem servidor.
{"id": "r1", "op": "ask", "to": "tienda", "thread": "cliente-42", "text": "vocês têm pão integral?"}
{"id": "r2", "op": "agents"}
{"id": "r3", "op": "ping"}
Pelo stdout saem os mesmos eventos que com --json, cada um com o id do seu pedido, e um done ao terminar cada ask. Ao iniciar ele emite {"kind": "ready", "data": {"agents": […], "protocol": 2, "warnings": […]}}: em warnings, uma linha por ferramenta que algum agente lista e não vai ter (um plugin desligado, um nome errado). Antes de um ask desse agente sai também um evento warning. Com LAMPSON_BUILTIN_TOOLS=off, o processo não oferece nenhuma ferramenta própria do Lampson (é a opção lampsonTools: false do SDK).
- Conversas diferentes rodam em paralelo; dois pedidos da mesma conversa (agente + thread) são atendidos em ordem.
"mode": "strict"ou"yolo"em umaskfixa as permissões desse pedido (é o seu programa, na sua máquina).- Ferramentas do app (o que o
lampson.tool()do SDK usa):{"op": "tools", "tools": [{"name", "description", "parameters", "timeout"}]}substitui a lista inteira. Quando o modelo chama uma, sai{"kind": "tool_request", "data": {"call_id", "name", "args", "ctx"}}, e o seu programa responde{"op": "tool_result", "call_id", "output"}(ou"error").ctxé o contexto do pedido (from,thread,meta…), que o modelo não escreve. - Uma linha que não é JSON devolve um
errore o processo continua. Fechar o stdin encerra o processo quando os pedidos em andamento terminam.