notis-automation

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Notis Automation Skill

Notis自动化技能

Use this skill whenever the user wants something to happen later, on a schedule, or in response to an event. It covers the three Notis building blocks and how they fit together:
  • Skills hold the business logic — the reusable "what to do".
  • Automations are the glue: they link a trigger to business logic. They are also how you make Notis do something in the future.
  • Reminders are dumb: they deliver a fixed message at a time or on a schedule. No reasoning, no tools, no computed content.
The single most important job of this skill is to pick the right primitive, then build a valid payload for it.
当用户希望在未来某个时间、按计划或响应某个事件执行某项操作时,使用此技能。它涵盖了Notis的三个构建模块及其协作方式:
  • Skills(技能) 承载业务逻辑——即可复用的“执行内容”。
  • Automations(自动化) 是“粘合剂”:它们将触发器与业务逻辑关联起来,也是让Notis在未来执行操作的方式。
  • Reminders(提醒) 是“无智能”的:它们会在指定时间或按计划发送固定消息,无需推理、工具或计算内容。
此技能最重要的职责是选择正确的基础组件,然后为其构建有效的负载。

Tool names

工具名称

These are native Notis tools. When their canonical
LOCAL_NOTIS_*
names are available in the current tool set, call them directly. Do not send an already-available native automation or reminder tool through
COMPOSIO_SEARCH_TOOLS
or wrap it in
COMPOSIO_MULTI_EXECUTE_TOOL
; discovery is only for a capability that is not loaded. Always call native tools by their canonical names:
AreaCanonical tools
Reminders
LOCAL_NOTIS_INSERT_REMINDER
,
LOCAL_NOTIS_UPDATE_REMINDER
,
LOCAL_NOTIS_LIST_REMINDERS
,
LOCAL_NOTIS_DELETE_REMINDER
Automations
LOCAL_NOTIS_INSERT_AUTOMATION
,
LOCAL_NOTIS_UPDATE_AUTOMATION
,
LOCAL_NOTIS_LIST_AUTOMATIONS
,
LOCAL_NOTIS_GET_AUTOMATION
,
LOCAL_NOTIS_RUN_AUTOMATION
,
LOCAL_NOTIS_LIST_AUTOMATION_RUNS
,
LOCAL_NOTIS_GET_AUTOMATION_RUN
,
LOCAL_NOTIS_DELETE_AUTOMATION
,
LOCAL_NOTIS_LIST_INTEGRATION_TRIGGERS
Skills
LOCAL_NOTIS_CREATE_SKILL
,
LOCAL_NOTIS_LIST_SKILLS
,
LOCAL_NOTIS_UPDATE_SKILL
,
LOCAL_NOTIS_INSTALL_SKILL
,
LOCAL_NOTIS_DISABLE_SKILL
,
LOCAL_NOTIS_DELETE_SKILL
Databases (for
database
triggers)
LOCAL_NOTIS_DATABASE_LIST_DATABASES
,
LOCAL_NOTIS_DATABASE_GET_DATABASE
这些是Notis的原生工具。当当前工具集中提供了它们的标准
LOCAL_NOTIS_*
名称时,请直接调用。不要将已可用的原生自动化或提醒工具通过
COMPOSIO_SEARCH_TOOLS
发送,也不要将其包装在
COMPOSIO_MULTI_EXECUTE_TOOL
中;仅当所需功能未加载时才进行发现。请始终使用标准名称调用原生工具:
领域标准工具
提醒
LOCAL_NOTIS_INSERT_REMINDER
,
LOCAL_NOTIS_UPDATE_REMINDER
,
LOCAL_NOTIS_LIST_REMINDERS
,
LOCAL_NOTIS_DELETE_REMINDER
自动化
LOCAL_NOTIS_INSERT_AUTOMATION
,
LOCAL_NOTIS_UPDATE_AUTOMATION
,
LOCAL_NOTIS_LIST_AUTOMATIONS
,
LOCAL_NOTIS_GET_AUTOMATION
,
LOCAL_NOTIS_RUN_AUTOMATION
,
LOCAL_NOTIS_LIST_AUTOMATION_RUNS
,
LOCAL_NOTIS_GET_AUTOMATION_RUN
,
LOCAL_NOTIS_DELETE_AUTOMATION
,
LOCAL_NOTIS_LIST_INTEGRATION_TRIGGERS
技能
LOCAL_NOTIS_CREATE_SKILL
,
LOCAL_NOTIS_LIST_SKILLS
,
LOCAL_NOTIS_UPDATE_SKILL
,
LOCAL_NOTIS_INSTALL_SKILL
,
LOCAL_NOTIS_DISABLE_SKILL
,
LOCAL_NOTIS_DELETE_SKILL
数据库(用于
database
触发器)
LOCAL_NOTIS_DATABASE_LIST_DATABASES
,
LOCAL_NOTIS_DATABASE_GET_DATABASE

The paradigm

范式

trigger  ->  automation  ->  business logic (often a skill)
time     ->  reminder     ->  static message
  • A trigger is anything that should start work: a clock (cron), a future moment (one-time), an inbound HTTP call (webhook), an external integration event (new email, new calendar event), or a change to a Notis database record.
  • An automation binds a trigger to a
    prompt
    that the Notis agent actually runs (a full agent turn). The prompt is the glue, not the place to dump a long procedure.
  • A skill is where the real, reusable procedure lives. When the work is non-trivial or will be reused, put the steps in a skill and have the automation's prompt cite that skill (
    /skill-name
    ). Keep automation prompts thin; keep logic in skills.
  • A reminder is for when there is literally nothing to compute — the user just wants a nudge with fixed text.
trigger  ->  automation  ->  business logic (often a skill)
time     ->  reminder     ->  static message
  • 触发器是任何应启动任务的事件:时钟(cron表达式)、未来某个时刻(一次性)、入站HTTP请求(webhook)、外部集成事件(新邮件、新日历事件),或者Notis数据库记录的变更。
  • 自动化将触发器与Notis代理实际执行的
    prompt
    (完整代理轮次)绑定。prompt是粘合剂,而非存放冗长流程的地方。
  • 技能是真正可复用流程的载体。当任务非 trivial 或需要复用时,将步骤放入技能中,并让自动化的prompt引用该技能(
    /skill-name
    )。保持自动化prompt简洁;将逻辑放在技能中。
  • 提醒适用于完全无需计算的场景——用户仅需一条固定文本的提示。

Choose the primitive

选择基础组件

The user wants...UseWhy
A fixed nudge at a time or on a schedule ("remind me to call the dentist at 5pm")ReminderNo reasoning needed — just deliver the exact text
Work to run on a schedule, on an event, or via a webhook ("every Monday summarize last week's deals", "reply when a new Gmail arrives")AutomationA trigger must run business logic
To run a one-off task in the future ("in two hours, draft the recap")Automation with
trigger_type: "one_time"
"Do something later" that involves work is still an automation
A future message with fixed text and no computation ("at 6pm tonight, message me 'leave for the airport'")Reminder with
trigger_type: "one_time"
Future, but still just a static message
The procedure to be reusable across many triggers/threadsA skill (cited by the automation)Business logic belongs in a skill
Rules of thumb:
  • If the action needs the agent to think, read or write a database, call any tool, fetch anything, or produce computed text → automation, never a reminder.
  • "In the future" alone does not mean reminder. A future task with work is a one-time automation; a future fixed message is a one-time reminder.
  • If you find yourself writing a long step-by-step procedure inside an automation
    prompt
    , stop and move it into a skill, then cite the skill from the prompt.
Before creating anything, list what already exists (
LOCAL_NOTIS_LIST_REMINDERS
,
LOCAL_NOTIS_LIST_AUTOMATIONS
) so you do not create a duplicate, and confirm the trigger and the action with the user in plain language.

用户需求...使用原因
在指定时间或按计划发送固定提示(如“提醒我下午5点给牙医打电话”)提醒无需推理——只需发送确切文本
按计划、事件或webhook执行任务(如“每周一总结上周的交易情况”、“收到新Gmail邮件时回复”)自动化触发器必须执行业务逻辑
在未来执行一次性任务(如“两小时后,撰写回顾摘要”)自动化,设置
trigger_type: "one_time"
“稍后执行某项操作”涉及任务处理,仍属于自动化
在未来发送固定文本消息且无需计算(如“今晚6点,给我发消息‘出发去机场’”)提醒,设置
trigger_type: "one_time"
虽为未来执行,但仅为静态消息
流程可在多个触发器/线程中复用技能(由自动化引用)业务逻辑应存放在技能中
经验法则:
  • 如果操作需要代理进行思考、读写数据库、调用任何工具、获取数据或生成计算文本 → 自动化,绝不要用提醒。
  • 仅“在未来执行”并不意味着要用提醒。涉及任务处理的未来任务是一次性自动化;仅发送未来固定消息的是一次性提醒。
  • 如果发现自己在自动化
    prompt
    中编写冗长的分步流程,请停止并将其移至技能中,然后在prompt中引用该技能。
创建任何内容之前,请列出已存在的项(
LOCAL_NOTIS_LIST_REMINDERS
、
LOCAL_NOTIS_LIST_AUTOMATIONS
),避免创建重复项,并以通俗易懂的语言与用户确认触发器和操作内容。

Two rules for writing automation prompts

编写自动化Prompt的两条规则

These two mistakes break automations. Always follow them.
这两个错误会导致自动化失效,请务必遵守。

1. Never put the delivery destination in the prompt

1. 绝不要在Prompt中指定交付目标

Where the automation's response goes is set by the
channel
(and
channel_account_id
) field — not the prompt. The automation's output is delivered to that channel automatically.
  • Do not write "send this to me on WhatsApp", "post the summary to Slack", "email me the result", or "reply in this thread" in the prompt.
  • The prompt describes only the work and the output to produce. Delivery is configured separately.
Bad  prompt:  "Summarize yesterday's sales and post it to my Slack."
Good prompt:  "Summarize yesterday's sales."     (with channel: "slack")
自动化响应的交付位置由
channel
(和
channel_account_id
)字段设置——而非prompt。自动化的输出会自动交付到该渠道。
  • 不要在prompt中写入“将此发送到我的WhatsApp”、“将摘要发布到Slack”、“给我发邮件发送结果”或“在此线程中回复”。
  • prompt仅描述要执行的任务和要生成的输出。交付配置单独设置。
错误示例prompt:  "总结昨日的销售情况并发布到我的Slack。"
正确示例prompt:  "总结昨日的销售情况。"     (同时设置channel: "slack")

2. Never put scheduling / recurrence wording in the prompt

2. 绝不要在Prompt中写入调度/重复执行相关表述

The schedule lives in the trigger (the cron expression / one-time timestamp). The prompt runs once each time the trigger fires. If the prompt says "every morning", "each Monday", "daily", or "set this up to run…", the agent may interpret it as an instruction to create another automation — causing a recursive loop instead of doing the work.
  • Write the prompt as a single, present-tense action to perform right now.
  • Leave all timing/frequency to the trigger.
Bad  prompt:  "Every morning, send me a digest of new emails."
Good prompt:  "Compile a digest of emails received since yesterday."   (with cron: "0 8 * * *")

调度信息存放在触发器中(cron表达式 / 一次性时间戳)。每次触发器触发时,prompt仅执行一次。如果prompt中包含“每天早上”、“每周一”、“每日”或“设置此项以定期运行…”,代理可能会将其解读为创建另一个自动化的指令——导致递归循环而非执行任务。
  • 将prompt写作为单个、现在时态的操作,仿佛立即执行。
  • 所有时间/频率设置都交给触发器处理。
错误示例prompt:  "每天早上,给我发送新邮件摘要。"
正确示例prompt:  "整理昨日收到的邮件摘要。"   (同时设置cron: "0 8 * * *")

Reminders (dumb message delivery)

提醒(无智能消息交付)

A reminder stores a static
message
and delivers it verbatim through a channel — no agent run. Tools:
LOCAL_NOTIS_INSERT_REMINDER
,
LOCAL_NOTIS_UPDATE_REMINDER
,
LOCAL_NOTIS_LIST_REMINDERS
,
LOCAL_NOTIS_DELETE_REMINDER
.
trigger_type
is
"schedule"
(recurring) or
"one_time"
(single future delivery). Cannot be changed after creation.
Fields:
  • message
    (required) — the exact text to send (max 5000 chars). Static only. If it needs computation, it is an automation.
  • trigger_type
    (required) —
    "schedule"
    or
    "one_time"
    .
  • cron_expression
    (schedule only) — standard 5-field cron. Cannot run more often than once per hour.
  • expires_at
    (one_time only) — ISO 8601 with timezone, in the future.
  • channel
    (optional) —
    manager
    ,
    whatsapp
    ,
    slack
    ,
    telegram
    ,
    imessage
    ,
    sms
    ,
    email
    . Defaults to the channel the user is talking on.
  • channel_account
    /
    channel_account_id
    (optional) — required when the user has more than one account on the target channel. Resolve which account before asking the user for an id.
Recurring reminder:
json
{
  "trigger_type": "schedule",
  "message": "Stand up and stretch.",
  "cron_expression": "0 14 * * 1-5",
  "channel": "whatsapp"
}
One-time reminder:
json
{
  "trigger_type": "one_time",
  "message": "Leave now for the airport.",
  "expires_at": "2026-06-19T16:30:00-07:00"
}
Notes:
  • LOCAL_NOTIS_INSERT_REMINDER
    returns the new
    reminder_id
    , the user's
    active_reminders
    , and an
    llm_prompt
    asking you to check for duplicates — actually do that check and delete any duplicates.
  • LOCAL_NOTIS_UPDATE_REMINDER
    can change
    message
    ,
    channel
    ,
    status
    (
    active
    /
    paused
    ), and
    cron_expression
    /
    expires_at
    for the matching type. It cannot change
    trigger_type
    . For schedule reminders, the next run is managed by cron — do not try to set
    expires_at
    .
  • LOCAL_NOTIS_DELETE_REMINDER
    is a soft delete.

提醒会存储静态
message
并通过渠道原样发送——无需代理运行。工具包括:
LOCAL_NOTIS_INSERT_REMINDER
,
LOCAL_NOTIS_UPDATE_REMINDER
,
LOCAL_NOTIS_LIST_REMINDERS
,
LOCAL_NOTIS_DELETE_REMINDER
。
trigger_type
为
"schedule"
(重复执行)或
"one_time"
(单次未来交付)。创建后无法更改。
字段:
  • message
    (必填)——要发送的确切文本(最多5000字符)。仅支持静态内容。如果需要计算,则应使用自动化。
  • trigger_type
    (必填)——
    "schedule"
    或
    "one_time"
    。
  • cron_expression
    (仅schedule类型)——标准5字段cron表达式。执行频率不能超过每小时一次。
  • expires_at
    (仅one_time类型)——带时区的ISO 8601格式时间,且必须是未来时间。
  • channel
    (可选)——
    manager
    ,
    whatsapp
    ,
    slack
    ,
    telegram
    ,
    imessage
    ,
    sms
    ,
    email
    。默认为用户当前使用的渠道。
  • channel_account
    /
    channel_account_id
    (可选)——当用户在目标渠道拥有多个账户时必填。在向用户索要id之前,请先确定使用哪个账户。
重复提醒示例:
json
{
  "trigger_type": "schedule",
  "message": "站起来伸展一下。",
  "cron_expression": "0 14 * * 1-5",
  "channel": "whatsapp"
}
一次性提醒示例:
json
{
  "trigger_type": "one_time",
  "message": "现在出发去机场。",
  "expires_at": "2026-06-19T16:30:00-07:00"
}
注意事项:
  • LOCAL_NOTIS_INSERT_REMINDER
    会返回新的
    reminder_id
    、用户的
    active_reminders
    以及一个要求检查重复项的
    llm_prompt
    ——请务必执行此检查并删除任何重复项。
  • LOCAL_NOTIS_UPDATE_REMINDER
    可以更改
    message
    、
    channel
    、
    status
    (
    active
    /
    paused
    ),以及对应类型的
    cron_expression
    /
    expires_at
    。无法更改
    trigger_type
    。对于重复提醒,下次运行时间由cron管理——不要尝试设置
    expires_at
    。
  • LOCAL_NOTIS_DELETE_REMINDER
    为软删除。

Automations (trigger -> business logic)

自动化(触发器 → 业务逻辑)

An automation runs its
prompt
as a real agent turn when its trigger fires. Tools:
ToolPurpose
LOCAL_NOTIS_INSERT_AUTOMATION
Create an automation
LOCAL_NOTIS_UPDATE_AUTOMATION
Change fields (not
trigger_type
)
LOCAL_NOTIS_LIST_AUTOMATIONS
Browse/search existing automations
LOCAL_NOTIS_GET_AUTOMATION
Read one automation in full
LOCAL_NOTIS_RUN_AUTOMATION
Fire it now (manual / test run)
LOCAL_NOTIS_LIST_AUTOMATION_RUNS
See past runs and whether delivery happened
LOCAL_NOTIS_GET_AUTOMATION_RUN
Inspect one run
LOCAL_NOTIS_DELETE_AUTOMATION
Remove it
LOCAL_NOTIS_LIST_INTEGRATION_TRIGGERS
Discover available integration triggers + config schemas (call before building an
integration
automation)
Common
LOCAL_NOTIS_INSERT_AUTOMATION
fields:
  • prompt
    (required) — the instruction the agent runs when the trigger fires (max 5000 chars). Keep it thin, present-tense, single-run; cite a skill for real logic. Follow the two prompt rules above: no delivery destination, no recurrence wording.
  • trigger_type
    (required) — one of
    schedule
    ,
    one_time
    ,
    webhook
    ,
    integration
    ,
    database
    . Cannot be changed later.
  • name
    (optional) — short label.
  • channel
    /
    channel_account_id
    (optional) — where the result is delivered; defaults to the current channel. This is the one and only place delivery is set.
  • keep_context
    (optional, default false) —
    true
    reuses a single pinned thread across runs;
    false
    starts a fresh thread each run.
  • intelligence_mode
    (optional) —
    auto
    (default),
    low
    ,
    medium
    , or
    high
    .
LOCAL_NOTIS_INSERT_AUTOMATION
returns
automation_id
, the portal URLs, and — for webhooks — the
webhook_url
. Surface those to the user.
当触发器触发时,自动化会将其
prompt
作为真实的代理轮次执行。工具如下:
工具用途
LOCAL_NOTIS_INSERT_AUTOMATION
创建自动化
LOCAL_NOTIS_UPDATE_AUTOMATION
修改字段(
trigger_type
除外)
LOCAL_NOTIS_LIST_AUTOMATIONS
浏览/搜索现有自动化
LOCAL_NOTIS_GET_AUTOMATION
读取单个自动化的完整信息
LOCAL_NOTIS_RUN_AUTOMATION
立即触发(手动/测试运行)
LOCAL_NOTIS_LIST_AUTOMATION_RUNS
查看过往运行记录及是否成功交付
LOCAL_NOTIS_GET_AUTOMATION_RUN
检查单个运行记录
LOCAL_NOTIS_DELETE_AUTOMATION
删除自动化
LOCAL_NOTIS_LIST_INTEGRATION_TRIGGERS
发现可用的集成触发器+配置模式(在构建
integration
自动化之前调用)
LOCAL_NOTIS_INSERT_AUTOMATION
的常用字段:
  • prompt
    (必填)——触发器触发时代理执行的指令(最多5000字符)。保持简洁、现在时态、单次运行;引用技能来处理实际逻辑。遵守上述两条prompt规则:不要指定交付目标,不要包含重复执行表述。
  • trigger_type
    (必填)——
    schedule
    ,
    one_time
    ,
    webhook
    ,
    integration
    ,
    database
    之一。创建后无法更改。
  • name
    (可选)——短标签。
  • channel
    /
    channel_account_id
    (可选)——结果交付的位置;默认为当前渠道。这是设置交付位置的唯一地方。
  • keep_context
    (可选,默认false)——
    true
    表示在多次运行中复用单个固定线程;
    false
    表示每次运行启动新线程。
  • intelligence_mode
    (可选)——
    auto
    (默认)、
    low
    、
    medium
    或
    high
    。
LOCAL_NOTIS_INSERT_AUTOMATION
会返回
automation_id
、门户URL,对于webhook类型还会返回
webhook_url
。请将这些信息告知用户。

Trigger type: schedule (recurring)

触发器类型:schedule(重复执行)

Standard 5-field cron, minimum interval one hour. The recurrence lives here — keep it out of the prompt.
expires_at
is reserved for one-time automations and must not be set on a recurring schedule. To stop a recurring automation, pause or delete it explicitly.
json
{
  "trigger_type": "schedule",
  "name": "Weekly deal recap",
  "cron_expression": "0 9 * * 1",
  "prompt": "Compile last week's closed deals using /weekly-deal-recap and produce the summary.",
  "channel": "slack"
}
Cron quick reference:
0 * * * *
hourly ·
0 9 * * *
daily 09:00 ·
0 9 * * 1
Mondays 09:00 ·
0 9 * * 1-5
weekdays 09:00. Build a concrete expression — never leave the schedule unresolved.
标准5字段cron表达式,最小间隔为一小时。重复执行信息存放在此处——不要写入prompt中。
expires_at
仅用于一次性自动化,绝不能在重复调度中设置。要停止重复自动化,请显式暂停或删除它。
json
{
  "trigger_type": "schedule",
  "name": "每周交易回顾",
  "cron_expression": "0 9 * * 1",
  "prompt": "使用/weekly-deal-recap整理上周已完成的交易并生成摘要。",
  "channel": "slack"
}
Cron快速参考:
0 * * * *
每小时 ·
0 9 * * *
每日09:00 ·
0 9 * * 1
每周一09:00 ·
0 9 * * 1-5
工作日09:00。请构建具体的表达式——不要留下未明确的调度。

Trigger type: one_time (do something in the future)

触发器类型:one_time(未来执行某项操作)

A single future run that does real work.
expires_at
is ISO 8601 with timezone, in the future.
json
{
  "trigger_type": "one_time",
  "name": "Draft launch recap",
  "expires_at": "2026-06-20T18:00:00-07:00",
  "prompt": "Draft the launch recap from today's notes."
}
If the future action is just a fixed message, use a one-time reminder instead.
单次未来运行,执行实际任务。
expires_at
为带时区的ISO 8601格式时间,且必须是未来时间。
json
{
  "trigger_type": "one_time",
  "name": "撰写发布回顾",
  "expires_at": "2026-06-20T18:00:00-07:00",
  "prompt": "根据今日笔记撰写发布回顾。"
}
如果未来操作仅为固定消息,请改用一次性提醒。

Trigger type: webhook (inbound HTTP)

触发器类型:webhook(入站HTTP请求)

No trigger config; the tool returns a generated
webhook_url
to POST to. Give that URL to the user.
json
{
  "trigger_type": "webhook",
  "name": "Lead intake",
  "prompt": "A new lead was posted to this webhook. Enrich it with /lead-intake and add a row to the CRM database."
}
无需触发器配置;工具会返回生成的
webhook_url
用于POST请求。请将该URL告知用户。
json
{
  "trigger_type": "webhook",
  "name": "潜在客户导入",
  "prompt": "有新的潜在客户提交到该webhook。使用/lead-intake丰富客户信息并添加到CRM数据库中。"
}

Trigger type: integration (connected app events)

触发器类型:integration(关联应用事件)

Fires on an external event (new Gmail message, new calendar event, PostForMe social post or account changes, etc.). Always call
LOCAL_NOTIS_LIST_INTEGRATION_TRIGGERS
first
— it returns providers, connected toolkits, valid
triggerName
s, each trigger's
config_schema
, and the user's
connectedAccountId
s. Never invent a provider, trigger name, or account id; use the exact values it returns. If the toolkit has multiple connected accounts, ask which one. PostForMe supports post created, updated, deleted, publish-result-created, and account-updated events; account-created is intentionally unavailable because integration cards target an existing account.
The trigger catalog is authoritative. Once the event and account are resolved, call
LOCAL_NOTIS_INSERT_AUTOMATION
directly with the returned values. Do not call
COMPOSIO_SEARCH_TOOLS
between listing triggers and inserting the automation
: PostForMe events are provider webhook events, not Composio action tools, and the native insert tool is already known.
json
{
  "trigger_type": "integration",
  "name": "Auto-file new emails",
  "prompt": "A new email arrived. Classify it with /email-triage and file the action items.",
  "integration_trigger_config": {
    "provider": "composio",
    "toolkit": "GMAIL",
    "triggers": [
      {
        "provider": "composio",
        "toolkit": "GMAIL",
        "triggerName": "GMAIL_NEW_GMAIL_MESSAGE",
        "config": { "label": "inbox" },
        "connectedAccountId": "ca_xxx"
      }
    ]
  }
}
PostForMe example:
json
{
  "trigger_type": "integration",
  "name": "Notify on new LinkedIn posts",
  "prompt": "Summarize the new social post in one sentence.",
  "channel": "manager",
  "integration_trigger_config": {
    "provider": "postforme",
    "toolkit": "LINKEDIN",
    "triggers": [
      {
        "provider": "postforme",
        "toolkit": "LINKEDIN",
        "triggerName": "social.post.created",
        "connectedAccountId": "spc_xxx",
        "config": {}
      }
    ]
  }
}
在外部事件触发时执行(如新Gmail邮件、新日历事件、PostForMe社交帖子或账户变更等)。请务必先调用
LOCAL_NOTIS_LIST_INTEGRATION_TRIGGERS
——它会返回提供商、关联工具包、有效的
triggerName
、每个触发器的
config_schema
以及用户的
connectedAccountId
。绝不要自行编造提供商、触发器名称或账户id;请使用它返回的确切值。如果工具包关联了多个账户,请询问用户使用哪个。PostForMe支持帖子创建、更新、删除、发布结果创建和账户更新事件;账户创建事件故意不可用,因为集成卡片针对现有账户。
触发器目录是权威来源。确定事件和账户后,请直接调用
LOCAL_NOTIS_INSERT_AUTOMATION
并传入返回的值。在列出触发器和插入自动化之间不要调用
COMPOSIO_SEARCH_TOOLS
:PostForMe事件是提供商webhook事件,而非Composio操作工具,且原生插入工具已可用。
json
{
  "trigger_type": "integration",
  "name": "自动归档新邮件",
  "prompt": "收到新邮件。使用/email-triage分类邮件并归档行动项。",
  "integration_trigger_config": {
    "provider": "composio",
    "toolkit": "GMAIL",
    "triggers": [
      {
        "provider": "composio",
        "toolkit": "GMAIL",
        "triggerName": "GMAIL_NEW_GMAIL_MESSAGE",
        "config": { "label": "inbox" },
        "connectedAccountId": "ca_xxx"
      }
    ]
  }
}
PostForMe示例:
json
{
  "trigger_type": "integration",
  "name": "新LinkedIn帖子通知",
  "prompt": "用一句话总结新的社交帖子。",
  "channel": "manager",
  "integration_trigger_config": {
    "provider": "postforme",
    "toolkit": "LINKEDIN",
    "triggers": [
      {
        "provider": "postforme",
        "toolkit": "LINKEDIN",
        "triggerName": "social.post.created",
        "connectedAccountId": "spc_xxx",
        "config": {}
      }
    ]
  }
}

Trigger type: database (Notis record change)

触发器类型:database(Notis记录变更)

Fires when records in a native Notis database are added or changed. Use
LOCAL_NOTIS_DATABASE_LIST_DATABASES
and
LOCAL_NOTIS_DATABASE_GET_DATABASE
(see the
notis-query
skill) to resolve the real
database_id
and the exact
property_id
s before building the config — never guess them.
The config is
{ database_id, root }
, where
root
is a condition tree. Each condition's
event
is one of
page_added
(record inserted),
any_property_edited
(any property changed), or
property_edited
(a specific property changed, requires
property_id
+
comparator
). Comparators depend on the property kind (e.g.
equals
,
changed_from_to
,
contains
,
greater_than
,
before
).
changed_from_to
needs
from_value
+
to_value
; value-based comparators need
value
.
json
{
  "trigger_type": "database",
  "name": "Notify on task done",
  "prompt": "A task was just marked Done. Run /task-followup to add a note and check for follow-ups.",
  "database_trigger_config": {
    "database_id": "tasks-db-id",
    "root": {
      "kind": "group",
      "operator": "and",
      "children": [
        {
          "kind": "condition",
          "event": "property_edited",
          "property_id": "prop_status",
          "comparator": "changed_from_to",
          "from_value": "In Progress",
          "to_value": "Done"
        }
      ]
    }
  }
}
当Notis原生数据库中的记录添加或变更时触发。请使用
LOCAL_NOTIS_DATABASE_LIST_DATABASES
和
LOCAL_NOTIS_DATABASE_GET_DATABASE
(参考
notis-query
技能)来确定真实的
database_id
和确切的
property_id
——绝不要猜测。
配置为
{ database_id, root }
,其中
root
是条件树。每个条件的
event
为
page_added
(记录插入)、
any_property_edited
(任意属性变更)或
property_edited
(特定属性变更,需
property_id
+
comparator
)之一。比较器取决于属性类型(如
equals
、
changed_from_to
、
contains
、
greater_than
、
before
)。
changed_from_to
需要
from_value
+
to_value
;基于值的比较器需要
value
。
json
{
  "trigger_type": "database",
  "name": "任务完成通知",
  "prompt": "任务刚被标记为完成。运行/task-followup添加备注并检查后续任务。",
  "database_trigger_config": {
    "database_id": "tasks-db-id",
    "root": {
      "kind": "group",
      "operator": "and",
      "children": [
        {
          "kind": "condition",
          "event": "property_edited",
          "property_id": "prop_status",
          "comparator": "changed_from_to",
          "from_value": "In Progress",
          "to_value": "Done"
        }
      ]
    }
  }
}

Running, verifying, updating

运行、验证与更新

  • LOCAL_NOTIS_RUN_AUTOMATION
    fires immediately (good for a test) and returns a
    run_id
    .
  • LOCAL_NOTIS_LIST_AUTOMATION_RUNS
    shows whether each run produced a delivered message (
    delivery_detected
    ) — use it to confirm an automation actually works.
  • LOCAL_NOTIS_UPDATE_AUTOMATION
    changes any field except
    trigger_type
    ; set
    status
    to
    paused
    /
    active
    to disable/enable. Automations synced from a team template (
    automation_template_id
    present) lock
    name
    and
    prompt
    — tell the user to duplicate it to edit.

  • LOCAL_NOTIS_RUN_AUTOMATION
    会立即触发(适合测试)并返回
    run_id
    。
  • LOCAL_NOTIS_LIST_AUTOMATION_RUNS
    会显示每次运行是否成功交付消息(
    delivery_detected
    )——用它确认自动化是否正常工作。
  • LOCAL_NOTIS_UPDATE_AUTOMATION
    可以修改除
    trigger_type
    外的任何字段;设置
    status
    为
    paused
    /
    active
    来禁用/启用自动化。从团队模板同步的自动化(存在
    automation_template_id
    )会锁定
    name
    和
    prompt
    ——请告知用户需复制后再编辑。

The skill-as-business-logic pattern

技能作为业务逻辑的模式

This is the core of the paradigm: put logic in a skill, point an automation at it.
Creating the skill: use
notis-skill-creator
.
Whenever the business logic needs to live in a new (or updated) skill, follow the
notis-skill-creator
skill — it is the source of truth for the authoring workflow: defining the
name
/
description
, structuring
SKILL.md
(and optional
scripts/
/
references/
/
assets/
), validating the frontmatter, and saving directly into Notis with
LOCAL_NOTIS_CREATE_SKILL
(
name
,
description
, and
skill_md
or
bundle_url
). Do not hand-roll skill creation here; defer to
notis-skill-creator
for the details, then come back and wire the automation to it.
Worked example — "Every Monday, summarize last week's closed deals and post to Slack":
  1. Logic → skill. If no skill covers it, author one by following
    notis-skill-creator
    and saving it with
    LOCAL_NOTIS_CREATE_SKILL
    . The skill
    SKILL.md
    holds the real procedure: which database to query, how to filter to last week's closed deals, and the summary format.
  2. Trigger + delivery → automation. Create a
    schedule
    automation whose
    prompt
    cites the skill, and set the delivery channel on the
    channel
    field — not in the prompt:
    json
    {
      "trigger_type": "schedule",
      "name": "Weekly deal recap",
      "cron_expression": "0 9 * * 1",
      "prompt": "Run /weekly-deal-recap for last week and produce the summary.",
      "channel": "slack",
      "channel_account_id": "channel_slack:acme#T123"
    }
    The cron carries the "every Monday"; the channel carries "to Slack". The prompt carries neither.
  3. When the trigger fires, Notis injects the cited skill's full
    SKILL.md
    as the workflow and executes it, then delivers the output to the configured channel. The automation stayed thin; the logic stayed reusable.
Use the same pattern for webhook, integration, and database automations: the trigger differs, but the
prompt
should still hand off to a skill for any non-trivial work. Reach for an inline prompt only when the action is a single, self-evident instruction.

这是范式的核心:将逻辑放入技能,让自动化指向它。
创建技能:使用
notis-skill-creator
。
每当业务逻辑需要存放在新(或更新)的技能中时,请遵循
notis-skill-creator
技能——它是创作流程的权威来源:定义
name
/
description
、构建
SKILL.md
(以及可选的
scripts/
/
references/
/
assets/
)、验证前置内容,并通过
LOCAL_NOTIS_CREATE_SKILL
(传入
name
、
description
和
skill_md
或
bundle_url
)直接保存到Notis中。不要在此手动创建技能;请将细节交给
notis-skill-creator
处理,然后返回此处将自动化与技能关联。
示例——“每周一,总结上周已完成的交易并发布到Slack”:
  1. 逻辑 → 技能。 如果没有现有技能覆盖此逻辑,请遵循
    notis-skill-creator
    创作技能并通过
    LOCAL_NOTIS_CREATE_SKILL
    保存。技能的
    SKILL.md
    包含实际流程:查询哪个数据库、如何筛选上周已完成的交易、摘要格式等。
  2. 触发器 + 交付 → 自动化。 创建一个
    schedule
    类型的自动化,其
    prompt
    引用该技能,并在
    channel
    字段中设置交付渠道——不要写入prompt:
    json
    {
      "trigger_type": "schedule",
      "name": "每周交易回顾",
      "cron_expression": "0 9 * * 1",
      "prompt": "运行/weekly-deal-recap处理上周数据并生成摘要。",
      "channel": "slack",
      "channel_account_id": "channel_slack:acme#T123"
    }
    cron表达式承载“每周一”的调度;channel字段承载“到Slack”的交付位置。prompt中不包含这两者。
  3. 当触发器触发时,Notis会将引用技能的完整
    SKILL.md
    作为工作流注入并执行,然后将输出交付到配置的渠道。自动化保持简洁;逻辑保持可复用。
对webhook、集成和数据库自动化使用相同模式:触发器不同,但
prompt
仍应将任何非 trivial 的任务交给技能处理。仅当操作是单个自明的指令时,才使用内联prompt。

House rules

内部规则

  • Plain language to the user. Talk about "a reminder", "a weekly automation", "the Slack channel", "the Tasks database" — not tool names,
    trigger_type
    values, or raw JSON. Build and validate the payloads internally.
  • Delivery is the channel, never the prompt. Set where output goes via
    channel
    /
    channel_account_id
    . Keep "send to…", "post to…", "email me…", "reply in thread" out of the automation
    prompt
    .
  • No recurrence wording in the prompt. The schedule lives in the trigger. A prompt that says "every morning" or "set up a daily…" risks the agent creating another automation instead of doing the work. Write the prompt as one present-tense action.
  • Discover before you ask. Resolve picker-backed values yourself before asking the user: channel account (when multiple), integration toolkit/trigger/connected account (
    LOCAL_NOTIS_LIST_INTEGRATION_TRIGGERS
    ), and database id + property ids (
    LOCAL_NOTIS_DATABASE_LIST_DATABASES
    /
    LOCAL_NOTIS_DATABASE_GET_DATABASE
    ). One match → confirm; several → offer the choices; none → ask or defer.
  • Never invent identifiers. Integration providers,
    triggerName
    s,
    connectedAccountId
    s,
    database_id
    s, and
    property_id
    s must come from discovery, not memory.
  • Resolve the schedule. A schedule trigger needs a concrete cron expression; a one-time trigger needs a real future timestamp with timezone. Do not create a scheduled item with the timing unresolved.
  • Dedupe. List existing reminders/automations first and remove duplicates rather than stacking near-identical ones.
  • Confirm, then create. Recap the trigger and the action in one short plain-language line, get a yes, create it, then surface the portal URL (and webhook URL, if any).
  • Right primitive. Static message → reminder. Work on a trigger → automation. Reusable logic → skill cited by the automation. When in doubt between a one-time reminder and a one-time automation, ask whether the future action is fixed text or actual work.
  • 用通俗易懂的语言与用户沟通。 谈论“提醒”、“每周自动化”、“Slack渠道”、“任务数据库”——不要提及工具名称、
    trigger_type
    值或原始JSON。在内部构建并验证负载。
  • 交付位置由channel设置,绝不要在prompt中指定。 通过
    channel
    /
    channel_account_id
    设置输出位置。不要在自动化
    prompt
    中写入“发送到…”、“发布到…”、“给我发邮件…”、“在线程中回复”。
  • prompt中不要包含重复执行表述。 调度信息存放在触发器中。包含“每天早上”或“设置每日…”的prompt可能导致代理创建另一个自动化而非执行任务。将prompt写作为单个现在时态的操作。
  • 先发现再询问。 在询问用户之前自行确定需要选择的值:渠道账户(当有多个时)、集成工具包/触发器/关联账户(
    LOCAL_NOTIS_LIST_INTEGRATION_TRIGGERS
    )、数据库id + 属性id(
    LOCAL_NOTIS_DATABASE_LIST_DATABASES
    /
    LOCAL_NOTIS_DATABASE_GET_DATABASE
    )。匹配到一个→确认;多个→提供选项;无匹配→询问或延后处理。
  • 绝不要自行编造标识符。 集成提供商、
    triggerName
    、
    connectedAccountId
    、
    database_id
    和
    property_id
    必须来自发现,而非记忆。
  • 明确调度信息。 调度触发器需要具体的cron表达式;一次性触发器需要带时区的真实未来时间戳。不要创建调度信息未明确的项。
  • 去重。 先列出现有提醒/自动化,删除重复项,而非创建多个近乎相同的项。
  • 确认后再创建。 用简短的通俗易懂语言概括触发器和操作,获得用户确认后再创建,然后告知用户门户URL(以及webhook URL,如果有的话)。
  • 选择正确的基础组件。 静态消息→提醒。触发器驱动的任务→自动化。可复用逻辑→由自动化引用的技能。当不确定使用一次性提醒还是一次性自动化时,请询问用户未来操作是固定文本还是实际任务。