lmnr-cli signal creates, inspects, updates, and deletes Signals from your terminal. Keep a Signal’s prompt and schema in your repo, ship changes from CI, or hand the surface to a coding agent that can shell out.
signal ships in the standalone lmnr-cli npm package. You do not need the @lmnr-ai/lmnr SDK installed to use it.Install and authenticate
setup once per project:
.lmnr/project.json, so every signal command in that directory (or any subdirectory) targets that project. Override per command with --project-id <uuid>. See Authenticate and Directory-scoped projects.
The rest of this page assumes a global install. With npx, prefix each command with npx lmnr-cli@latest.
Create a Signal
A Signal is a prompt, a schema, a trigger, and filters. At minimumsignal create needs a name, --prompt, and --schema:
root-span-finished, the filter to total_token_count > 1000, and the mode to realtime, so the Signal is already live on new traces. See Triggers and Filters for how they work.
--schema takes a JSON Schema object:
- Field names must be identifiers:
^[a-zA-Z_][a-zA-Z0-9_]*$. - Field types are
string,number, orboolean. For a fixed set of values, use"type": "string"with anenumarray. - Every field is required.
typeandrequiredare filled in for you if you omit them.
--filter takes JSON {"column":"...","operator":"...","value":"..."} and is repeatable. Columns: total_token_count, status, span_names. Pass it on create to replace the default.
--span-name is the trigger flag. span_names is a filter column: it matches a name anywhere in the trace.--sample-rate <1-95>evaluates only that percentage of matching traces. Omit it for no sampling.--disabledcreates the Signal paused. Turn it on later withsignal update --no-disabled.
Creating a Signal also creates a Critical-severity event alert subscribed to your email. Route it to Slack, change the severity, or add output-schema filters from the Signal’s Settings > Alerts section. See Alerts.
List and inspect Signals
signal get to see one Signal in full:
<signal> accepts either an id or a name, so you rarely need to look up a uuid. An ambiguous name is an error listing the candidates rather than a silent pick, since update and delete change things:
signal get renders the trigger and filters in the same syntax the flags accept, so its output is copy-pasteable into signal update.
Machine-readable output
Every subcommand takes--json, which prints structured JSON to stdout while human-facing messages go to stderr. That keeps pipes clean for scripts and coding agents:
Update a Signal
signal update is a partial patch: any flag you omit keeps its stored value. Changing the prompt cannot clear your sampling, reactivate a paused Signal, or alter when it fires.
Delete a Signal
Reference
signal subcommand:
signal create
signal update
signal list, get, delete
What’s next
Signals
How a Signal reads a whole trace and turns it into structured events.
Quickstart
Write your first Signal in the UI and run it over historical traces.
Alerts
Fire Slack or email notifications on the events your Signal produces.
CLI
The rest of
lmnr-cli: setup, SQL queries, datasets, and debug sessions.