notis-automation
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseNotis 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 names are available in the current tool set, call them directly. Do not send an already-available native automation or reminder tool through or wrap it in ; discovery is only for a capability that is not loaded. Always call native tools by their canonical names:
LOCAL_NOTIS_*COMPOSIO_SEARCH_TOOLSCOMPOSIO_MULTI_EXECUTE_TOOL| Area | Canonical tools |
|---|---|
| Reminders | |
| Automations | |
| Skills | |
Databases (for | |
这些是Notis的原生工具。当当前工具集中提供了它们的标准名称时,请直接调用。不要将已可用的原生自动化或提醒工具通过发送,也不要将其包装在中;仅当所需功能未加载时才进行发现。请始终使用标准名称调用原生工具:
LOCAL_NOTIS_*COMPOSIO_SEARCH_TOOLSCOMPOSIO_MULTI_EXECUTE_TOOL| 领域 | 标准工具 |
|---|---|
| 提醒 | |
| 自动化 | |
| 技能 | |
数据库(用于 | |
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 that the Notis agent actually runs (a full agent turn). The prompt is the glue, not the place to dump a long procedure.
prompt - 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 (). Keep automation prompts thin; keep logic in skills.
/skill-name - 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引用该技能()。保持自动化prompt简洁;将逻辑放在技能中。
/skill-name - 提醒适用于完全无需计算的场景——用户仅需一条固定文本的提示。
Choose the primitive
选择基础组件
| The user wants... | Use | Why |
|---|---|---|
| A fixed nudge at a time or on a schedule ("remind me to call the dentist at 5pm") | Reminder | No 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") | Automation | A trigger must run business logic |
| To run a one-off task in the future ("in two hours, draft the recap") | Automation with | "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 | Future, but still just a static message |
| The procedure to be reusable across many triggers/threads | A 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 , stop and move it into a skill, then cite the skill from the prompt.
prompt
Before creating anything, list what already exists (, ) so you do not create a duplicate, and confirm the trigger and the action with the user in plain language.
LOCAL_NOTIS_LIST_REMINDERSLOCAL_NOTIS_LIST_AUTOMATIONS| 用户需求... | 使用 | 原因 |
|---|---|---|
| 在指定时间或按计划发送固定提示(如“提醒我下午5点给牙医打电话”) | 提醒 | 无需推理——只需发送确切文本 |
| 按计划、事件或webhook执行任务(如“每周一总结上周的交易情况”、“收到新Gmail邮件时回复”) | 自动化 | 触发器必须执行业务逻辑 |
| 在未来执行一次性任务(如“两小时后,撰写回顾摘要”) | 自动化,设置 | “稍后执行某项操作”涉及任务处理,仍属于自动化 |
| 在未来发送固定文本消息且无需计算(如“今晚6点,给我发消息‘出发去机场’”) | 提醒,设置 | 虽为未来执行,但仅为静态消息 |
| 流程可在多个触发器/线程中复用 | 技能(由自动化引用) | 业务逻辑应存放在技能中 |
经验法则:
- 如果操作需要代理进行思考、读写数据库、调用任何工具、获取数据或生成计算文本 → 自动化,绝不要用提醒。
- 仅“在未来执行”并不意味着要用提醒。涉及任务处理的未来任务是一次性自动化;仅发送未来固定消息的是一次性提醒。
- 如果发现自己在自动化中编写冗长的分步流程,请停止并将其移至技能中,然后在prompt中引用该技能。
prompt
创建任何内容之前,请列出已存在的项(、),避免创建重复项,并以通俗易懂的语言与用户确认触发器和操作内容。
LOCAL_NOTIS_LIST_REMINDERSLOCAL_NOTIS_LIST_AUTOMATIONSTwo 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 (and ) field — not the prompt. The automation's output is delivered to that channel automatically.
channelchannel_account_id- 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")自动化响应的交付位置由(和)字段设置——而非prompt。自动化的输出会自动交付到该渠道。
channelchannel_account_id- 不要在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 and delivers it verbatim through a channel — no agent run. Tools: , , , .
messageLOCAL_NOTIS_INSERT_REMINDERLOCAL_NOTIS_UPDATE_REMINDERLOCAL_NOTIS_LIST_REMINDERSLOCAL_NOTIS_DELETE_REMINDERtrigger_type"schedule""one_time"Fields:
- (required) — the exact text to send (max 5000 chars). Static only. If it needs computation, it is an automation.
message - (required) —
trigger_typeor"schedule"."one_time" - (schedule only) — standard 5-field cron. Cannot run more often than once per hour.
cron_expression - (one_time only) — ISO 8601 with timezone, in the future.
expires_at - (optional) —
channel,manager,whatsapp,slack,telegram,imessage,sms. Defaults to the channel the user is talking on.email - /
channel_account(optional) — required when the user has more than one account on the target channel. Resolve which account before asking the user for an id.channel_account_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:
- returns the new
LOCAL_NOTIS_INSERT_REMINDER, the user'sreminder_id, and anactive_remindersasking you to check for duplicates — actually do that check and delete any duplicates.llm_prompt - can change
LOCAL_NOTIS_UPDATE_REMINDER,message,channel(status/active), andpaused/cron_expressionfor the matching type. It cannot changeexpires_at. For schedule reminders, the next run is managed by cron — do not try to settrigger_type.expires_at - is a soft delete.
LOCAL_NOTIS_DELETE_REMINDER
提醒会存储静态并通过渠道原样发送——无需代理运行。工具包括:, , , 。
messageLOCAL_NOTIS_INSERT_REMINDERLOCAL_NOTIS_UPDATE_REMINDERLOCAL_NOTIS_LIST_REMINDERSLOCAL_NOTIS_DELETE_REMINDERtrigger_type"schedule""one_time"字段:
- (必填)——要发送的确切文本(最多5000字符)。仅支持静态内容。如果需要计算,则应使用自动化。
message - (必填)——
trigger_type或"schedule"。"one_time" - (仅schedule类型)——标准5字段cron表达式。执行频率不能超过每小时一次。
cron_expression - (仅one_time类型)——带时区的ISO 8601格式时间,且必须是未来时间。
expires_at - (可选)——
channel,manager,whatsapp,slack,telegram,imessage,sms。默认为用户当前使用的渠道。email - /
channel_account(可选)——当用户在目标渠道拥有多个账户时必填。在向用户索要id之前,请先确定使用哪个账户。channel_account_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。对于重复提醒,下次运行时间由cron管理——不要尝试设置trigger_type。expires_at - 为软删除。
LOCAL_NOTIS_DELETE_REMINDER
Automations (trigger -> business logic)
自动化(触发器 → 业务逻辑)
An automation runs its as a real agent turn when its trigger fires. Tools:
prompt| Tool | Purpose |
|---|---|
| Create an automation |
| Change fields (not |
| Browse/search existing automations |
| Read one automation in full |
| Fire it now (manual / test run) |
| See past runs and whether delivery happened |
| Inspect one run |
| Remove it |
| Discover available integration triggers + config schemas (call before building an |
Common fields:
LOCAL_NOTIS_INSERT_AUTOMATION- (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.
prompt - (required) — one of
trigger_type,schedule,one_time,webhook,integration. Cannot be changed later.database - (optional) — short label.
name - /
channel(optional) — where the result is delivered; defaults to the current channel. This is the one and only place delivery is set.channel_account_id - (optional, default false) —
keep_contextreuses a single pinned thread across runs;truestarts a fresh thread each run.false - (optional) —
intelligence_mode(default),auto,low, ormedium.high
LOCAL_NOTIS_INSERT_AUTOMATIONautomation_idwebhook_url当触发器触发时,自动化会将其作为真实的代理轮次执行。工具如下:
prompt| 工具 | 用途 |
|---|---|
| 创建自动化 |
| 修改字段( |
| 浏览/搜索现有自动化 |
| 读取单个自动化的完整信息 |
| 立即触发(手动/测试运行) |
| 查看过往运行记录及是否成功交付 |
| 检查单个运行记录 |
| 删除自动化 |
| 发现可用的集成触发器+配置模式(在构建 |
LOCAL_NOTIS_INSERT_AUTOMATION- (必填)——触发器触发时代理执行的指令(最多5000字符)。保持简洁、现在时态、单次运行;引用技能来处理实际逻辑。遵守上述两条prompt规则:不要指定交付目标,不要包含重复执行表述。
prompt - (必填)——
trigger_type,schedule,one_time,webhook,integration之一。创建后无法更改。database - (可选)——短标签。
name - /
channel(可选)——结果交付的位置;默认为当前渠道。这是设置交付位置的唯一地方。channel_account_id - (可选,默认false)——
keep_context表示在多次运行中复用单个固定线程;true表示每次运行启动新线程。false - (可选)——
intelligence_mode(默认)、auto、low或medium。high
LOCAL_NOTIS_INSERT_AUTOMATIONautomation_idwebhook_urlTrigger type: schedule (recurring)
触发器类型:schedule(重复执行)
Standard 5-field cron, minimum interval one hour. The recurrence lives here — keep it out of the prompt. 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.
expires_atjson
{
"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: hourly · daily 09:00 · Mondays 09:00 · weekdays 09:00. Build a concrete expression — never leave the schedule unresolved.
0 * * * *0 9 * * *0 9 * * 10 9 * * 1-5标准5字段cron表达式,最小间隔为一小时。重复执行信息存放在此处——不要写入prompt中。仅用于一次性自动化,绝不能在重复调度中设置。要停止重复自动化,请显式暂停或删除它。
expires_atjson
{
"trigger_type": "schedule",
"name": "每周交易回顾",
"cron_expression": "0 9 * * 1",
"prompt": "使用/weekly-deal-recap整理上周已完成的交易并生成摘要。",
"channel": "slack"
}Cron快速参考: 每小时 · 每日09:00 · 每周一09:00 · 工作日09:00。请构建具体的表达式——不要留下未明确的调度。
0 * * * *0 9 * * *0 9 * * 10 9 * * 1-5Trigger type: one_time (do something in the future)
触发器类型:one_time(未来执行某项操作)
A single future run that does real work. is ISO 8601 with timezone, in the future.
expires_atjson
{
"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.
单次未来运行,执行实际任务。为带时区的ISO 8601格式时间,且必须是未来时间。
expires_atjson
{
"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 to POST to. Give that URL to the user.
webhook_urljson
{
"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."
}无需触发器配置;工具会返回生成的用于POST请求。请将该URL告知用户。
webhook_urljson
{
"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 first — it returns providers, connected toolkits, valid s, each trigger's , and the user's 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.
LOCAL_NOTIS_LIST_INTEGRATION_TRIGGERStriggerNameconfig_schemaconnectedAccountIdThe trigger catalog is authoritative. Once the event and account are resolved, call directly with the returned values. Do not call 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.
LOCAL_NOTIS_INSERT_AUTOMATIONCOMPOSIO_SEARCH_TOOLSjson
{
"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社交帖子或账户变更等)。请务必先调用——它会返回提供商、关联工具包、有效的、每个触发器的以及用户的。绝不要自行编造提供商、触发器名称或账户id;请使用它返回的确切值。如果工具包关联了多个账户,请询问用户使用哪个。PostForMe支持帖子创建、更新、删除、发布结果创建和账户更新事件;账户创建事件故意不可用,因为集成卡片针对现有账户。
LOCAL_NOTIS_LIST_INTEGRATION_TRIGGERStriggerNameconfig_schemaconnectedAccountId触发器目录是权威来源。确定事件和账户后,请直接调用并传入返回的值。在列出触发器和插入自动化之间不要调用:PostForMe事件是提供商webhook事件,而非Composio操作工具,且原生插入工具已可用。
LOCAL_NOTIS_INSERT_AUTOMATIONCOMPOSIO_SEARCH_TOOLSjson
{
"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 and (see the skill) to resolve the real and the exact s before building the config — never guess them.
LOCAL_NOTIS_DATABASE_LIST_DATABASESLOCAL_NOTIS_DATABASE_GET_DATABASEnotis-querydatabase_idproperty_idThe config is , where is a condition tree. Each condition's is one of (record inserted), (any property changed), or (a specific property changed, requires + ). Comparators depend on the property kind (e.g. , , , , ). needs + ; value-based comparators need .
{ database_id, root }rooteventpage_addedany_property_editedproperty_editedproperty_idcomparatorequalschanged_from_tocontainsgreater_thanbeforechanged_from_tofrom_valueto_valuevaluejson
{
"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_DATABASESLOCAL_NOTIS_DATABASE_GET_DATABASEnotis-querydatabase_idproperty_id配置为,其中是条件树。每个条件的为(记录插入)、(任意属性变更)或(特定属性变更,需 + )之一。比较器取决于属性类型(如、、、、)。需要 + ;基于值的比较器需要。
{ database_id, root }rooteventpage_addedany_property_editedproperty_editedproperty_idcomparatorequalschanged_from_tocontainsgreater_thanbeforechanged_from_tofrom_valueto_valuevaluejson
{
"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
运行、验证与更新
- fires immediately (good for a test) and returns a
LOCAL_NOTIS_RUN_AUTOMATION.run_id - shows whether each run produced a delivered message (
LOCAL_NOTIS_LIST_AUTOMATION_RUNS) — use it to confirm an automation actually works.delivery_detected - changes any field except
LOCAL_NOTIS_UPDATE_AUTOMATION; settrigger_typetostatus/pausedto disable/enable. Automations synced from a team template (activepresent) lockautomation_template_idandname— tell the user to duplicate it to edit.prompt
- 会立即触发(适合测试)并返回
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 . Whenever the business logic needs to live in a new (or updated) skill, follow the skill — it is the source of truth for the authoring workflow: defining the /, structuring (and optional //), validating the frontmatter, and saving directly into Notis with (, , and or ). Do not hand-roll skill creation here; defer to for the details, then come back and wire the automation to it.
notis-skill-creatornotis-skill-creatornamedescriptionSKILL.mdscripts/references/assets/LOCAL_NOTIS_CREATE_SKILLnamedescriptionskill_mdbundle_urlnotis-skill-creatorWorked example — "Every Monday, summarize last week's closed deals and post to Slack":
-
Logic → skill. If no skill covers it, author one by followingand saving it with
notis-skill-creator. The skillLOCAL_NOTIS_CREATE_SKILLholds the real procedure: which database to query, how to filter to last week's closed deals, and the summary format.SKILL.md -
Trigger + delivery → automation. Create aautomation whose
schedulecites the skill, and set the delivery channel on thepromptfield — not in the prompt:channeljson{ "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. -
When the trigger fires, Notis injects the cited skill's fullas the workflow and executes it, then delivers the output to the configured channel. The automation stayed thin; the logic stayed reusable.
SKILL.md
Use the same pattern for webhook, integration, and database automations: the trigger differs, but the 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.
prompt这是范式的核心:将逻辑放入技能,让自动化指向它。
创建技能:使用。 每当业务逻辑需要存放在新(或更新)的技能中时,请遵循技能——它是创作流程的权威来源:定义/、构建(以及可选的//)、验证前置内容,并通过(传入、和或)直接保存到Notis中。不要在此手动创建技能;请将细节交给处理,然后返回此处将自动化与技能关联。
notis-skill-creatornotis-skill-creatornamedescriptionSKILL.mdscripts/references/assets/LOCAL_NOTIS_CREATE_SKILLnamedescriptionskill_mdbundle_urlnotis-skill-creator示例——“每周一,总结上周已完成的交易并发布到Slack”:
-
逻辑 → 技能。 如果没有现有技能覆盖此逻辑,请遵循创作技能并通过
notis-skill-creator保存。技能的LOCAL_NOTIS_CREATE_SKILL包含实际流程:查询哪个数据库、如何筛选上周已完成的交易、摘要格式等。SKILL.md -
触发器 + 交付 → 自动化。 创建一个类型的自动化,其
schedule引用该技能,并在prompt字段中设置交付渠道——不要写入prompt:channeljson{ "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中不包含这两者。 -
当触发器触发时,Notis会将引用技能的完整作为工作流注入并执行,然后将输出交付到配置的渠道。自动化保持简洁;逻辑保持可复用。
SKILL.md
对webhook、集成和数据库自动化使用相同模式:触发器不同,但仍应将任何非 trivial 的任务交给技能处理。仅当操作是单个自明的指令时,才使用内联prompt。
promptHouse rules
内部规则
- Plain language to the user. Talk about "a reminder", "a weekly automation", "the Slack channel", "the Tasks database" — not tool names, values, or raw JSON. Build and validate the payloads internally.
trigger_type - Delivery is the channel, never the prompt. Set where output goes via /
channel. Keep "send to…", "post to…", "email me…", "reply in thread" out of the automationchannel_account_id.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 (), and database id + property ids (
LOCAL_NOTIS_LIST_INTEGRATION_TRIGGERS/LOCAL_NOTIS_DATABASE_LIST_DATABASES). One match → confirm; several → offer the choices; none → ask or defer.LOCAL_NOTIS_DATABASE_GET_DATABASE - Never invent identifiers. Integration providers, s,
triggerNames,connectedAccountIds, anddatabase_ids must come from discovery, not memory.property_id - 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渠道”、“任务数据库”——不要提及工具名称、值或原始JSON。在内部构建并验证负载。
trigger_type - 交付位置由channel设置,绝不要在prompt中指定。 通过/
channel设置输出位置。不要在自动化channel_account_id中写入“发送到…”、“发布到…”、“给我发邮件…”、“在线程中回复”。prompt - prompt中不要包含重复执行表述。 调度信息存放在触发器中。包含“每天早上”或“设置每日…”的prompt可能导致代理创建另一个自动化而非执行任务。将prompt写作为单个现在时态的操作。
- 先发现再询问。 在询问用户之前自行确定需要选择的值:渠道账户(当有多个时)、集成工具包/触发器/关联账户()、数据库id + 属性id(
LOCAL_NOTIS_LIST_INTEGRATION_TRIGGERS/LOCAL_NOTIS_DATABASE_LIST_DATABASES)。匹配到一个→确认;多个→提供选项;无匹配→询问或延后处理。LOCAL_NOTIS_DATABASE_GET_DATABASE - 绝不要自行编造标识符。 集成提供商、、
triggerName、connectedAccountId和database_id必须来自发现,而非记忆。property_id - 明确调度信息。 调度触发器需要具体的cron表达式;一次性触发器需要带时区的真实未来时间戳。不要创建调度信息未明确的项。
- 去重。 先列出现有提醒/自动化,删除重复项,而非创建多个近乎相同的项。
- 确认后再创建。 用简短的通俗易懂语言概括触发器和操作,获得用户确认后再创建,然后告知用户门户URL(以及webhook URL,如果有的话)。
- 选择正确的基础组件。 静态消息→提醒。触发器驱动的任务→自动化。可复用逻辑→由自动化引用的技能。当不确定使用一次性提醒还是一次性自动化时,请询问用户未来操作是固定文本还是实际任务。