wecomcli-calendar
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinese企业微信日程技能
WeCom Calendar Skill
执行任何命令前,必须先读取并完成wecom-cli技能的公共前置检查。wecomcli-shared
Before executing anycommands, you must first read and complete the public pre-checks of thewecom-cliskill.wecomcli-shared
适用范围
Scope of Application
适用
Applicable Scenarios
- 预约 / 创建日程(含纯线下面对面碰头,即不带在线会议链接的安排)
- 查看 / 浏览日程(今天有什么安排、查本周日程)
- 搜索日程(按关键词、按组织人、按参与人找某个日程)
- 更新 / 修改日程(改时间、改地点、加减人、换会议室;不支持更新周期日程)
- 取消日程(不支持取消周期日程)
- 查忙闲 / 约多人共同空闲时段
- 订会议室、查会议室空不空、查办公楼
- Schedule / create events (including in-person face-to-face meetings only, i.e., arrangements without online meeting links)
- View / browse events (e.g., "What arrangements do I have today?", "Check this week's events")
- Search events (find a specific event by keywords, organizer, or attendees)
- Update / modify events (change time, location, add/remove attendees, switch meeting rooms; recurring events are not supported for updates)
- Cancel events (recurring events are not supported for cancellation)
- Check availability / schedule a common free time slot for multiple people
- Book meeting rooms, check meeting room availability, check office buildings
不适用
Non-Applicable Scenarios
- 创建、更新、取消周期 / 重复日程(每周 / 每月 / 每天重复)→ 均不支持,引导用户在企业微信客户端手动操作
- 回复 / 拒绝日程邀请(接受 / 拒绝 / 待定,含"拒绝这个日程""不参加")→ 不支持,引导用户在企业微信客户端操作或私信发起人
- Create, update, or cancel recurring events (weekly/monthly/daily repeats) → Not supported; guide users to operate manually in the WeCom client
- Respond to / reject event invitations (accept/reject/tentative, including phrases like "Reject this event" "Will not attend") → Not supported; guide users to operate in the WeCom client or message the initiator directly
易混淆场景路由
Routing for Easily Confused Scenarios
- 用户要创建含在线会议链接的会议(需会议号 / 入会链接 / 远程或视频参会)→ 改用 (创建会议会同时生成日程,无需在本技能再建)
wecomcli-meeting - 用户仅说"开会 / 约个会 / 安排个会 / xx 会"等、未明确是日程还是在线会议(创建场景)→ 必须先用文字追问消歧(固定问题"需要创建日程还是会议?",请用户回复"日程 / 会议"),不得臆断直接创建
- 用户要的会同时支持线下与远程参会(如"线下开、外地同事远程接入")→ 含在线会议链接,改用
wecomcli-meeting - 仅给了地点 / 会议室号(如"在 1605 开会""订个会议室开会")→ 不构成"明确是日程",仍需先用文字询问消歧,不能因带地点就跳过追问
- 查询场景的模糊表述("最近有什么会 / 有哪些会")→ 严禁追问,日程和会议都查并合并展示;仅当明确提到"在线会议 / 视频会议 / 入会链接 / 会议号 / 腾讯会议 / 远程参会"时才改用 只查会议
wecomcli-meeting
- If the user wants to create a meeting with an online meeting link (requiring meeting ID/join link, remote or video attendance) → Use instead (creating a meeting will generate an event simultaneously, no need to create another in this skill)
wecomcli-meeting - If the user only mentions phrases like "hold a meeting/schedule a meeting/arrange a meeting/XX meeting" without specifying whether it's an event or an online meeting (creation scenario) → You must first use text to ask for disambiguation (fixed question: "Do you need to create an event or a meeting?", ask the user to reply with "Event / Meeting"), and must not make assumptions to create directly
- If the user needs a meeting that supports both in-person and remote attendance (e.g., "Hold offline, remote colleagues join online") → It includes an online meeting link; use instead
wecomcli-meeting - Only provides location / meeting room number (e.g., "Hold a meeting in 1605" "Book a meeting room for the meeting") → Does not constitute "clearly an event"; you still need to use text to ask for disambiguation, and cannot skip the question just because a location is provided
- Ambiguous expressions in query scenarios (e.g., "What meetings do I have recently / What meetings are there") → Strictly prohibited from asking for clarification; check both events and meetings and display the merged results; only switch to to check only meetings when the user clearly mentions "online meeting / video meeting / join link / meeting ID / Tencent Meeting / remote attendance"
wecomcli-meeting
路由规则
Routing Rules
| 用户意图 | 参考文档 |
|---|---|
| 预约日程、安排纯线下面对面会议(不含在线会议链接)、创建日程 | calendar-create |
| 看日程、今天有什么安排、查本周日程 | calendar-agenda |
| 找某个日程、项目评审是什么时候 | calendar-search |
| 查日程详情、看周期规则、看会议链接 | calendar-agenda |
| 取消日程、不开了 | calendar-cancel |
| 修改日程、更新日程、改时间、加人/移除人、换会议室 | calendar-update |
| 查忙闲、某人什么时候有空、约多人共同空闲 | calendar-freebusy |
| 订会议室、查会议室空不空、查办公楼、约会议室 | calendar-meeting-room |
浏览 vs 搜索的选择原则:用户提到日程主题关键词时走搜索;只给了时间/日期而无日程主题关键词时,必须走列表浏览()。需要周期规则、会议链接等详情时再读取单条日程详情补充。list
| User Intent | Reference Document |
|---|---|
| Schedule events, arrange in-person face-to-face meetings (without online meeting links), create events | calendar-create |
| View events, "What arrangements do I have today?", check this week's events | calendar-agenda |
| Find a specific event, "When is the project review?" | calendar-search |
| Check event details, view recurrence rules, view meeting links | calendar-agenda |
| Cancel events, "Don't hold it anymore" | calendar-cancel |
| Modify events, update events, change time, add/remove attendees, switch meeting rooms | calendar-update |
| Check availability, "When is someone free?", schedule a common free time slot for multiple people | calendar-freebusy |
| Book meeting rooms, check meeting room availability, check office buildings, schedule meeting rooms | calendar-meeting-room |
Principle for Choosing Browse vs Search: When the user mentions event subject keywords, use search; when only time/date is provided without event subject keywords, you must use list browsing (). Retrieve single event details only when additional information like recurrence rules or meeting links is needed.list
技能边界:日程 vs 会议 [CRITICAL]
Skill Boundary: Event vs Meeting [CRITICAL]
本技能(wecomcli-calendar)只负责日程——即非会议的日程安排,以及不含在线会议链接的纯线下面对面会议。只要涉及在线会议链接(含远程/视频参会)的会议,一律归 wecomcli-meeting 技能,不在本技能创建。
| 用户意图 | 归属技能 |
|---|---|
| 预约日程、安排纯线下面对面会议(不含在线会议链接)、订会议室、查/改/取消日程、查忙闲 | 本技能 wecomcli-calendar |
| 创建含在线会议链接的会议、需要会议号或入会链接的会、需要远程/视频参会的会 | wecomcli-meeting 技能 |
消歧规则(仅创建场景):用户仅说"会议/会/开个会/约个会/安排个会/xx会/xx会议"等而未明确是日程还是会议时,必须先用文字追问,再路由到对应技能,禁止默认直接创建日程。此文字消歧仅用于「创建」;查询场景严格禁止追问——明确指向在线会议时只查会议,明确是日程/安排时只查日程,模糊表述("会 / xx会 / 最近有什么会"等)则日程和会议都查(见下文「查询消歧」)。
问题与选项固定 [CRITICAL]:消歧确认时,问题与可选项都必须原文照用、严格禁止修改任何内容——问题固定为,可选项固定为"需要创建日程还是会议?"/日程;不得改写问题措辞、增减或改写选项、翻译,或自行设计其他表述(如"在线会议 / 线上会议 / 视频会议 / 线下会议"等)。会议
用文字向用户提问:
需要创建日程还是会议?(请回复:日程 / 会议)- "会议""会""开会"等词本身不构成"明确" [CRITICAL]:这些词只表示要碰头议事,并未说明是日程还是会议。禁止仅因 query 里出现"会议"二字就默认归本技能(日程)创建,也禁止反向默认成会议——只要未明确,一律先用文字追问后再路由。只有出现"碰个面/创建日程"等纯线下信号时才直接留在本技能。
- 用户答「日程」→ 留在本技能,按"预约日程工作流"创建日程。
- 用户答「会议」→ 改用 创建会议(创建会议会同时生成对应日程,无需在本技能再建一条)。
读取 wecomcli-meeting 技能 - 用户已明确(如"碰个面""创建日程"=日程;"发个入会链接""要会议号""远程参会"=会议)时,直接路由,无需追问。
- 同时支持线下与远程参会(如"线下开、外地同事远程接入")时,因含在线会议链接,归 wecomcli-meeting 技能:创建会议即同时生成日程,无需在本技能另建日程。
- 仅有地点/会议室号(如"在 1605 开会""到 A 座会议室碰一下""订个会议室开会")不构成"明确是日程"——会议室里同样可能要远程接入,是日程还是会议仍未知,必须先用文字询问消歧,不能因为带了地点就跳过追问。
This skill (wecomcli-calendar) is only responsible for Events — non-meeting event arrangements, and in-person face-to-face meetings without online meeting links. Any meeting involving online meeting links (including remote/video attendance) falls under the wecomcli-meeting skill and cannot be created in this skill.
| User Intent | Belonging Skill |
|---|---|
| Schedule events, arrange in-person face-to-face meetings (without online meeting links), book meeting rooms, view/modify/cancel events, check availability | This skill: wecomcli-calendar |
| Create meetings with online meeting links, meetings requiring meeting IDs or join links, meetings supporting remote/video attendance | wecomcli-meeting skill |
Disambiguation Rules (Creation Scenarios Only): When users only mention phrases like "meeting/hold a meeting/schedule a meeting/arrange a meeting/XX meeting/XX conference" without specifying whether it's an event or a meeting, you must first use text to ask for clarification, then route to the corresponding skill. Do not default to creating an event directly. This text disambiguation only applies to "creation"; strictly prohibit asking for clarification in query scenarios — check only meetings when clearly directed to online meetings, check only events when clearly directed to events/arrangements, and check both events and meetings for ambiguous expressions (e.g., "meeting / XX meeting / What meetings do I have recently") (see "Query Disambiguation" below).
Fixed Question and Options [CRITICAL]: When confirming disambiguation, the question and options must be used exactly as written — the fixed question is, and the fixed options are"Do you need to create an event or a meeting?"/Event; do not rephrase the question, add/remove or rephrase options, translate, or design other expressions (e.g., "online meeting / virtual meeting / video meeting / offline meeting").Meeting
Ask the user via text:
Do you need to create an event or a meeting? (Please reply: Event / Meeting)- The words "meeting" / "conference" / "hold a meeting" do not constitute "clarity" [CRITICAL]: These words only indicate the need to meet and discuss, and do not specify whether it's an event or a meeting. Do not default to creating an event in this skill just because the query contains "meeting", nor default to a meeting — as long as it's not clear, always ask for clarification via text first before routing. Only stay in this skill when there are pure offline signals like "meet in person" "create an event".
- If the user replies "Event" → Stay in this skill and create the event following the "Event Scheduling Workflow".
- If the user replies "Meeting" → Switch to to create the meeting (creating a meeting will generate a corresponding event simultaneously, no need to create another event in this skill).
read wecomcli-meeting skill - If the user has clearly specified (e.g., "meet in person" "create an event" = event; "send a join link" "need meeting ID" "remote attendance" = meeting) → Route directly without asking for clarification.
- If the meeting supports both in-person and remote attendance (e.g., "Hold offline, remote colleagues join online") → Since it includes an online meeting link, it belongs to the wecomcli-meeting skill: creating a meeting will generate an event simultaneously, no need to create another event in this skill.
- Only provides location/meeting room number (e.g., "Hold a meeting in 1605" "Meet in Building A's meeting room" "Book a meeting room for the meeting") does not constitute "clearly an event" — remote access may still be needed in the meeting room, so it's still unknown whether it's an event or a meeting; you must use text to ask for clarification, and cannot skip the question just because a location is provided.
改约 / 重建日程前必须先识别会议关联 [CRITICAL]
Must Identify Meeting Association Before Rescheduling / Re-creating Events [CRITICAL]
"改约 / 改时间 / 挪到 / 顺延 / 重新约"等改期意图(即使用户说"取消……再约到……",带"取消"也算改期),禁止机械拆成 + :
cancelcreate- 先定位再判定会议关联:/
search返回均含list字段,定位到目标日程后直接检查meeting——非空为「含在线会议链接的会议形态日程」,为空为纯日程;无需为此再补一次读取日程详情(仅当还需meeting.meeting_code等字段时才补)。repeat_rule - 纯日程 → 用本技能路由表中更新日程意图改时间,禁止 cancel + create。
- 含会议链接 → 改用 ,把
读取 wecomcli-meeting 技能传入meeting.meeting_id改时间(保留会议链接与参会人),无需重新 search 定位。meeting update
根因:只能建纯日程、重建不出会议链接(能拆不能合),cancel + create 会让会议链接永久丢失,故改约一律走 update。create
For rescheduling intentions like "reschedule / change time / move to / postpone / re-schedule" (even if the user says "cancel... then reschedule to..." with "cancel", it counts as rescheduling), do not mechanically split into + :
cancelcreate- Locate first, then determine meeting association: Both /
searchreturns include thelistfield. After locating the target event, directly checkmeeting— non-empty means "event in meeting form with online meeting link", empty means pure event; no need to retrieve event details again (only retrieve if additional fields likemeeting.meeting_codeare needed).repeat_rule - Pure event → Use the update event intent in this skill's routing table to change the time; do not use cancel + create.
- With meeting link → Switch to , pass
read wecomcli-meeting skilltomeeting.meeting_idto change the time (retain meeting link and attendees), no need to re-search and locate in wecomcli-meeting.meeting update
Root Cause:can only create pure events and cannot re-generate meeting links (can split but not merge). Using cancel + create will permanently lose the meeting link, so rescheduling must always use update.create
核心场景
Core Scenarios
1. 预约日程
1. Schedule Events
读取 calendar-create,按其中"预约日程工作流"执行(信息补全 → 参与人解析 → 时间协商/忙闲检查 → 执行创建 → 结果反馈)。
Read calendar-create and execute according to the "Event Scheduling Workflow" (information completion → attendee parsing → time negotiation/availability check → execute creation → result feedback).
2. 查看/搜索日程
2. View/Search Events
| 场景 | 参考文档 |
|---|---|
| 泛泛查询("今天有什么安排") | calendar-agenda |
| 有关键词("项目评审是什么时候") | calendar-search |
需要详情(只拿到 | calendar-agenda |
浏览 vs 搜索:有日程主题关键词 → 搜索(不追问时间);只给时间/日期而无主题关键词 → 列表浏览(),禁止把日期当list喂给keywords。列表浏览已返回search,无需额外读取单条详情判断是否周期日程。repeat_rule
查询消歧(模糊查询时日程 + 会议都查)[REQUIRED]:查询场景严格禁止用文字追问"是日程还是会议"——日程/会议消歧追问仅用于创建,查询时一律按以下规则直接处理、不追问。判定分两个独立维度,不要混为一谈:维度一:查哪一边(日程 / 会议 / 两边都查)
- 明确是在线会议 → 用户明确提到"在线会议 / 视频会议 / 入会链接 / 会议号 / 腾讯会议 / 远程参会"等在线会议专属特征时,改用
只查会议。读取 wecomcli-meeting 技能- 明确是日程 / 安排 → 用户说的明显是日程类内容(如"日程 / 安排 / 我的安排 / 日历 / 今天有什么安排",且不带在线会议特征)时,只查日程。
- 模糊表述无法判定("会 / xx会 / xx会议 / 开会 / 最近有什么会 / 有哪些会 / 找下 xx会议"等,既可能是日程也可能是会议)→ 日程和会议都要查:既查日程,又
查会议。读取 wecomcli-meeting 技能维度二:每一边用还是search(与维度一独立,逐边各自判断)list
- 有主题/名称关键词(如"找下 xx会议""项目评审是什么时候")→ 该边用
(把关键词传入search)。keywords- 只有时间/日期或泛浏览无关键词(如"最近有什么会""今天有什么安排")→ 该边用
,禁止把日期当list喂给keywords。search- 即使"两边都查",也按本维度对每一边各自选择:带关键词时两边都用
,纯时间/泛浏览时两边都用search。list合并展示:两边都查时,合并结果后统一展示——按是否含在线会议链接分成「(会议)」(来自会议侧、或日程中非空者)和「(日程)」(meeting.meeting_code为空的纯日程)两部分,同一场会议在两边都出现时按"主题 + 时间"去重只保留一条,末尾汇总"共 N 场,其中会议 X 场、日程 Y 场"。meeting_code
- 本消歧仅针对查询;创建场景仍按上文"日程 vs 会议"用文字追问。
| Scenario | Reference Document |
|---|---|
| General query ("What arrangements do I have today?") | calendar-agenda |
| With keywords ("When is the project review?") | calendar-search |
Need details (when only | calendar-agenda |
Browse vs Search: With event subject keywords → Use search (no need to ask for time); only time/date provided without subject keywords → Use list browsing (), do not feed the date aslisttokeywords. List browsing already returnssearch, no need to retrieve single event details additionally to determine if it's a recurring event.repeat_rule
Query Disambiguation (Check both events and meetings for ambiguous queries) [REQUIRED]: Strictly prohibit asking the user "Is it an event or a meeting" via text in query scenarios — disambiguation via text only applies to creation; queries must be processed directly according to the following rules without asking for clarification. Judgment is divided into two independent dimensions, do not confuse them:Dimension 1: Which side to check (Event / Meeting / Both)
- Clearly online meeting → When the user clearly mentions exclusive features of online meetings like "online meeting / video meeting / join link / meeting ID / Tencent Meeting / remote attendance", switch to
to check only meetings.read wecomcli-meeting skill- Clearly event / arrangement → When the user clearly mentions event-related content (e.g., "event / arrangement / my arrangements / calendar / What arrangements do I have today" without online meeting features), check only events.
- Ambiguous expression cannot be determined (e.g., "meeting / XX meeting / XX conference / hold a meeting / What meetings do I have recently / What meetings are there / Find XX conference", which could be either an event or a meeting) → Check both events and meetings: Check events, and
to check meetings.read wecomcli-meeting skillDimension 2: Useorsearchfor each side (independent of Dimension 1, judge each side separately)list
- With subject/name keywords (e.g., "Find XX conference" "When is the project review?") → Use
for that side (pass the keywords tosearch).keywords- Only time/date or general browsing without keywords (e.g., "What meetings do I have recently" "What arrangements do I have today") → Use
for that side; do not feed the date aslisttokeywords.search- Even if "check both sides", choose for each side according to this dimension: use
for both sides when keywords are provided, usesearchfor both sides when only time/general browsing is provided.listMerged Display: When checking both sides, merge the results and display uniformly — divide into "(Meeting)" (from meeting side, or events with non-empty) and "(Event)" (pure events with emptymeeting.meeting_code) based on whether they contain online meeting links; deduplicate by "subject + time" if the same meeting appears on both sides, and add a summary at the end "Total N sessions, including X meetings and Y events".meeting_code
- This disambiguation only applies to queries; creation scenarios still use text to ask for clarification as per "Event vs Meeting" above.
3. 取消日程
3. Cancel Events
先定位日程(有日程主题关键词走搜索;只给时间/日期而无主题关键词走列表浏览 ,禁止把日期当 喂给 ),再判断是否周期日程(可直接读取列表返回的 ,无需额外读取单条详情)——周期日程不支持取消,告知用户并引导其在企业微信客户端操作(见「已知限制」)。普通日程不预先按"是否本人创建"拦截取消,直接执行取消并根据工具返回结果判断能否取消(成功返回 ,无权限则返回错误,此时告知用户并建议联系创建人)。若用户意图实为"改约 / 挪到 / 顺延"(即使带"取消"字样),按上文「改约 / 重建日程前必须先识别会议关联」走更新流程。 完整流程见 calendar-cancel。
listkeywordssearchrepeat_rule{}First locate the event (use search when event subject keywords are provided; use list browsing when only time/date is provided without subject keywords, do not feed the date as to ), then determine if it's a recurring event (directly read returned by the list, no need to retrieve single event details additionally) — Recurring events are not supported for cancellation, inform the user and guide them to operate in the WeCom client (see "Known Limitations"). For regular events, do not pre-block cancellation based on "whether created by the user", execute cancellation directly and judge whether it can be cancelled based on the tool's return result (success returns , permission error returns an error; inform the user and suggest contacting the creator in this case). If the user's intention is actually "reschedule / move to / postpone" (even with "cancel"), follow the "Must Identify Meeting Association Before Rescheduling / Re-creating Events" above to use the update process. The complete process is shown in calendar-cancel.
listkeywordssearchrepeat_rule{}4. 更新日程
4. Update Events
- 先定位日程(有日程主题关键词走搜索;只给时间/日期而无主题关键词走列表浏览 ,禁止把日期当
list喂给keywords),判断是否周期日程——周期日程不支持更新,告知用户并引导其在企业微信客户端操作(见「已知限制」),禁止逐场search拼凑或改为取消重建。普通日程收集修改内容后执行更新,不预先按"是否本人创建"拦截修改,直接执行更新并根据工具返回结果判断能否修改(成功返回更新后的update,无权限则返回错误,此时告知用户并建议联系创建人)。detail - 改时间/改地点/加减人/换会议室都走更新,不要取消重建。 换会议室时须先经 确认新会议室
rooms search再把新status=bookable传入更新(见 calendar-meeting-room)。meeting_room_id - 含在线会议链接的日程(定位结果中 非空)改时间不在本技能 update,须改用
meeting(见上文「改约 / 重建日程前必须先识别会议关联」)。读取 wecomcli-meeting 技能 - 更新日程的完整流程见 calendar-update。
- First locate the event (use search when event subject keywords are provided; use list browsing when only time/date is provided without subject keywords, do not feed the date as
listtokeywords), determine if it's a recurring event — Recurring events are not supported for updates, inform the user and guide them to operate in the WeCom client (see "Known Limitations"), do not patch by updating each session individually or change to cancel + create. For regular events, collect the modification content and execute the update; do not pre-block modification based on "whether created by the user", execute the update directly and judge whether it can be modified based on the tool's return result (success returns updatedsearch, permission error returns an error; inform the user and suggest contacting the creator in this case).detail - Changing time/location, adding/removing attendees, switching meeting rooms all use update, do not cancel and re-create. When switching meeting rooms, first confirm the new meeting room has via
status=bookable, then pass the newrooms searchto the update (see calendar-meeting-room).meeting_room_id - Updating the time of an event with an online meeting link (non-empty in the location result) is not done in this skill's update, switch to
meetinginstead (see "Must Identify Meeting Association Before Rescheduling / Re-creating Events" above).read wecomcli-meeting skill - The complete process for updating events is shown in calendar-update.
5. 查询忙闲 / 共同空闲
5. Check Availability / Common Free Time
查询参与人在指定时段的可用空闲时段(服务端已合并区间、过滤过去、按策略推荐),用于协调日程时间。详见 calendar-freebusy。
Query the available free time slots of attendees in the specified period (the server has merged intervals, filtered past times, and recommended according to strategies) for coordinating event times. For details, see calendar-freebusy.
核心概念
Core Concepts
- 日程(Schedule):日程系统中的单个事件,含主题、起止时间、参与人等属性。
- 全天日程(All-day):,只按日期占用,结束日期包含在日程内。
is_all_day=true - 周期日程(Recurring):,按规则重复出现。
repeat_rule.is_repeat=true - 参与人(Attendee):以 (
userid前缀)标识。用户提供的是姓名时通过wo解析为读取 wecomcli-contact 技能。userid - 忙闲(FreeBusy):查询参与人在指定时段是否有日程占用。
- 地点(Location):日程的地点为一段自由文本(字段)。用户给的地点是公司会议室时,须经会议室查询(
location)预订、以rooms search占用(见 calendar-meeting-room),不要把会议室名仅写进meeting_room_id;用户给的是非会议室的普通文本地点时才直接写入location。location - 会议室 / 办公楼(Meeting Room / Building):物理空间资源(与在线会议链接无关)。查可访问办公楼,
buildings list查会议室可订性,创建日程时传rooms search原子占用,更新日程时传meeting_room_id改订。详见 calendar-meeting-room。meeting_room_id - 时区(Timezone):每个日程带 (
timezone+timezone_id)。日程的timezone_offset/begin_time是该时区下的墙上时间,后台不做转换——传入和返回的时间字符串都按日程时区解释,禁止自行换算成东八区或本地时间。end_time
- Event (Schedule): A single event in the calendar system, including attributes like subject, start/end time, attendees, etc.
- All-day Event: , only occupies by date, and the end date is included in the event.
is_all_day=true - Recurring Event: , occurs repeatedly according to rules.
repeat_rule.is_repeat=true - Attendee: Identified by (prefix
userid). When the user provides a name, resolve it towoviauserid.read wecomcli-contact skill - FreeBusy: Query whether attendees have event occupancy in the specified period.
- Location: The location of an event is a free text field (). When the user provides a company meeting room as the location, it must be booked via meeting room query (
location) and occupied withrooms search(see calendar-meeting-room); do not only write the meeting room name intomeeting_room_id; when the user provides a non-meeting room ordinary text location, write it directly intolocation.location - Meeting Room / Building: Physical space resources (unrelated to online meeting links). Use to check accessible office buildings,
buildings listto check meeting room availability, passrooms searchto atomically occupy when creating events, and passmeeting_room_idto re-book when updating events. For details, see calendar-meeting-room.meeting_room_id - Timezone: Each event has a (
timezone+timezone_id). Thetimezone_offset/begin_timeof an event is the wall time in that timezone, and the backend does not perform conversion — the incoming and returned time strings are interpreted according to the event's timezone; do not convert them to UTC+8 or local time on your own.end_time
核心规则
Core Rules
规则 1: userid 获取 [CRITICAL]
Rule 1: Obtaining userid [CRITICAL]
- /
attendees/add_attendees/remove_attendees/userids等所有"成员 userid 列表"入参统一为对象数组,格式为has_attendees,不接受姓名或平铺字符串数组。[{"userid": "woxxx"}, {"userid": "woyyy"}] - (搜索按组织人)为单值,传 userid 字符串(
organizer前缀),不是数组。wo - 用户提供的是姓名时,通过 解析为对应 userid;多候选人时列出供用户选择,不自行猜测。
读取 wecomcli-contact 技能 - 禁止把姓名当 userid 拼接,禁止凭记忆或猜测编造 userid。
- 原因:日程 API 不支持用姓名匹配参与人,传入姓名会导致静默失败或邀请到错误的人。
- All input parameters for "member userid lists" such as /
attendees/add_attendees/remove_attendees/useridsmust be object arrays in the formathas_attendees; names or flat string arrays are not accepted.[{"userid": "woxxx"}, {"userid": "woyyy"}] - (search by organizer) is a single value, pass a userid string (prefix
organizer), not an array.wo - When the user provides a name, resolve it to the corresponding userid via ; when there are multiple candidates, list them for the user to choose, do not guess on your own.
read wecomcli-contact skill - Prohibit using names as userids, prohibit making up userids based on memory or guesses.
- Reason: The calendar API does not support matching attendees by name; passing names will cause silent failures or invitations to the wrong people.
规则 2: 写操作直接执行
Rule 2: Execute Write Operations Directly
- 创建日程、取消日程时,参数就绪后直接执行,无需向用户展示摘要或询问确认。
- 结果返回时禁止暴露 userid,只展示人名。
- 原因:上层交互已完整展示操作内容并完成确认,此处再展示一遍会造成冗余。
- When creating or canceling events, execute directly once the parameters are ready; no need to display a summary to the user or ask for confirmation.
- Prohibit exposing userid when returning results; only display names.
- Reason: The upper-layer interaction has already fully displayed the operation content and completed confirmation; displaying it again here will cause redundancy.
规则 3: 用户交互必须用文字询问 [CRITICAL]
Rule 3: Must Use Text to Ask for User Interaction [CRITICAL]
任何操作中,当必要参数不明确或需要用户做出选择时,必须用文字直接向用户提问,禁止自行猜测或使用默认值代替询问。提问时把可选项 / 候选值一并写进文字里,让用户直接回复。
以下情况均适用此规则:
- 必填参数及参与人缺失:创建日程的必填参数(/
subject/begin_time)以及参与人end_time无法从上下文中推断时,必须用文字询问;其余非必填参数(如地点)用户未明确指定时不专门询问,直接走默认值attendees - 多候选项需用户选择:搜索返回多个匹配日程、wecomcli-contact 技能搜索到多个同名候选人
- 操作范围需确认:如更换会议室时查到多个 bookable 候选,需用户选定具体一个
- 冲突处理:忙闲检查发现时间冲突,需用户决策
文字询问的约束:
- 列出的可选项 / 候选建议以 2~4 个为宜。可选候选多于 4 个时(如同名候选人、多个匹配日程),取最相关的前 4 个列出,并提示用户可进一步缩小范围(输入更精确的关键词 / 完整姓名 / 具体时间),不要一次性罗列 5 个及以上候选。
- 询问时间时,列出的候选时刻必须是精确到分钟的具体时刻(如"明天 14:00"、"周六 10:30"),禁止给出"上午/下午/傍晚/午间/上班后/下班前"等模糊时间选项——模糊选项会导致用户回复后仍需二次追问具体几点,必须一次问到可直接落为 的精确时刻。
begin_time
During any operation, when necessary parameters are unclear or the user needs to make a choice, you must directly ask the user via text, do not guess on your own or use default values instead of asking. Include the options / candidate values in the text when asking, so that the user can reply directly.
This rule applies to the following situations:
- Missing required parameters and attendees: When the required parameters for creating events (/
subject/begin_time) and attendeesend_timecannot be inferred from the context, you must ask via text; for other non-required parameters (e.g., location), do not ask specifically if the user does not specify, use default values directlyattendees - Multiple candidates require user selection: Multiple matching events returned by search, multiple candidates with the same name found by wecomcli-contact skill
- Need to confirm operation scope: e.g., multiple bookable candidates found when switching meeting rooms, need the user to select a specific one
- Conflict handling: Time conflict found during availability check, need user decision
Constraints for text inquiries:
- It is advisable to list 2~4 options / candidate suggestions. When there are more than 4 optional candidates (e.g., candidates with the same name, multiple matching events), list the top 4 most relevant ones, and prompt the user to narrow the scope further (enter more precise keywords / full name / specific time); do not list 5 or more candidates at once.
- When asking for time, the candidate times listed must be specific times accurate to the minute (e.g., "Tomorrow 14:00", "Saturday 10:30"); prohibit giving vague time options like "morning/afternoon/evening/noon/after work starts/before work ends" — vague options will require a second inquiry after the user replies, so you must ask for a precise time that can be directly set as in one go.
begin_time
规则 4: 任务简洁原则
Rule 4: Task Conciseness Principle
只完成用户要求的操作,不额外添加其他操作。
Only complete the operation requested by the user, do not add additional operations.
规则 5: 输入合法性检查
Rule 5: Input Legality Check
执行写操作前,验证以下输入的合法性:
- 时间格式:必须为 ,拒绝模糊表述直接传参(如"明天"不能直接传入,需先解析为具体时间)
YYYY-MM-DD HH:mm:ss - 时间顺序:必须晚于
end_time,拒绝零时长或负时长日程begin_time - userid 格式:必须为 前缀的字符串,不接受纯数字或中文姓名
wo - 历史时间:禁止创建完全在当前时刻之前的日程
Before executing write operations, verify the legality of the following inputs:
- Time format: Must be ; reject vague expressions and pass them directly as parameters (e.g., "tomorrow" cannot be passed directly, must be resolved to a specific time first)
YYYY-MM-DD HH:mm:ss - Time order: must be later than
end_time; reject events with zero or negative durationbegin_time - userid format: Must be a string with prefix ; pure numbers or Chinese names are not accepted
wo - Historical time: Prohibit creating events that are completely before the current time
规则 6: 输入安全处理
Rule 6: Input Security Handling
- 用户提供的是姓名时,必须经过 搜索验证后才能转换为 userid。
读取 wecomcli-contact 技能 - 禁止把姓名直接拼接为 userid,禁止凭记忆或猜测编造。
- 原因:用户输入的字符串可能不对应真实员工(姓名不唯一、已离职等),直接拼接会导致将日程邀请发送给错误的人,且此类错误无法被 API 在调用时拦截。
- When the user provides a name, it must be verified via search before being converted to userid.
read wecomcli-contact skill - Prohibit directly using names as userids, prohibit making up userids based on memory or guesses.
- Reason: The string input by the user may not correspond to a real employee (non-unique name, resigned, etc.); directly using it as a userid will result in sending event invitations to the wrong people, and such errors cannot be intercepted by the API during calls.
操作参考
Operation References
| 操作参考 | 读取时机 | 说明 |
|---|---|---|
| 查看/获取日程详情时 | 查看日程安排(list + get) |
| 创建日程时 | 创建日程并邀请参与人 |
| 搜索日程时 | 按关键词搜索日程 |
| 取消日程时 | 取消日程(不支持周期日程) |
| 更新/修改日程时 | 更新日程信息(主题、时间、参与人、地点等) |
| 需要协调时间 / 查共同空闲时 | 查询共同空闲时段,协调日程时间 |
| 预订/更换会议室 / 查办公楼或会议室可订性时 | 办公楼清单( |
| Operation Reference | Reading Timing | Description |
|---|---|---|
| When viewing/obtaining event details | View event arrangements (list + get) |
| When creating events | Create events and invite attendees |
| When searching events | Search events by keywords |
| When canceling events | Cancel events (recurring events not supported) |
| When updating/modifying events | Update event information (subject, time, attendees, location, etc.) |
| When needing to coordinate time / check common free time | Query common free time slots and coordinate event times |
| When booking/switching meeting rooms / checking office building or meeting room availability | Office building list ( |
上下文传递表
Context Transfer Table
此表描述接口间的数据流转契约,第一列"来源操作"为业务语义;各操作的完整参数与字段定义见对应 reference。
| 来源操作 | 从返回中提取 | 用于 |
|---|---|---|
| 搜索(search) | | 单条详情、取消日程 |
| 列表浏览 / 单条详情(list / get) | | 单条详情、取消日程 |
| 搜索(search) | | 直接展示参与人姓名,无需额外反查(搜索接口已返回) |
| 搜索(search) | | 直接展示日程创建者姓名 |
| 搜索(search) | | 分页翻页控制 |
| wecomcli-contact 技能搜索 | | 创建/更新日程的 |
| 搜索 / 列表浏览 / 单条详情 | | 判断是否周期日程( |
| 搜索 / 列表浏览 / 单条详情 | | 识别该日程含在线会议链接(非空即「会议形态日程」,search/list/get 均直接返回,无需额外补 |
| 搜索 / 列表浏览 + 单条详情 | 搜索取 | 更新日程的定位与周期日程判断(命中周期日程则不支持更新) |
| 忙闲查询 | | 直接展示推荐时段,挑前几个让用户选择;展示时只用人名,userid 仅回传创建日程的 |
会议室可订性查询( | | 创建日程的 |
This table describes the data flow contract between interfaces; the first column "Source Operation" is the business semantics; the complete parameters and field definitions for each operation are shown in the corresponding reference.
| Source Operation | Extract from Return | Used For |
|---|---|---|
| Search (search) | | Single event details, cancel events |
| List browse / single event details (list / get) | | Single event details, cancel events |
| Search (search) | | Directly display attendee names, no need to reverse query additionally (already returned by the search interface) |
| Search (search) | | Directly display the event creator's name |
| Search (search) | | Pagination control |
| wecomcli-contact skill search | | |
| Search / list browse / single event details | | Determine if it's a recurring event ( |
| Search / list browse / single event details | | Identify that the event contains an online meeting link (non-empty means "event in meeting form"; search/list/get all return it directly, no need to supplement with |
| Search / list browse + single event details | Extract | Location and recurring event judgment for updating events (if it's a recurring event, update is not supported) |
| Availability query | | Directly display recommended time slots, select the first few for the user to choose; only display names when showing, userid is only passed back to |
Meeting room availability query ( | | |
错误处理
Error Handling
原则:告诉用户出了什么问题 + 可以怎么做 + 备选方案。禁止静默失败。
| 场景 | 恢复建议 |
|---|---|
| 搜索无结果 | 用文字提供恢复建议:1. 更换关键词重试;2. 按组织人搜索(提供姓名,解析 userid 后传 |
| 通讯录多候选人 | 用文字列出候选人(姓名+部门)供选择 |
| wecomcli-contact 技能搜索无结果 | 用文字提示用户确认姓名,等待重新输入 |
| 取消/修改非本人创建的日程 | 不预先拦截,直接执行命令;返回权限错误时说明当前用户无权操作,建议联系创建人 |
共同空闲查询返回空 | 引导用户扩大时间窗口或减少参与人,不要在同一窗口反复重试 |
共同空闲查询降级( | 告知哪些人冲突、几人能参加,由用户决定是否按降级时段安排或更换时间 |
Principle: Tell the user what went wrong + what can be done + alternative solutions. Prohibit silent failures.
| Scenario | Recovery Suggestions |
|---|---|
| No search results | Provide recovery suggestions via text: 1. Retry with different keywords; 2. Search by organizer (provide name, resolve to userid then pass |
| Multiple candidates in address book | List candidates (name + department) via text for the user to choose |
| No results from wecomcli-contact skill search | Prompt the user to confirm the name via text and wait for re-input |
| Cancel/modify events not created by the user | Do not pre-block, execute the command directly; when a permission error is returned, explain that the current user has no permission to operate, suggest contacting the creator |
Availability query returns empty | Guide the user to expand the time window or reduce the number of attendees, do not retry repeatedly in the same window |
Availability query degradation ( | Inform which people have conflicts and how many can attend, let the user decide whether to arrange according to the degraded time slot or change the time |
输出质量标准
Output Quality Standards
好的输出应满足以下条件:
- 日程列表:按开始时间升序排序,每条日程作为独立条目顺序输出(禁止 markdown 表格),每个条目只含主题、时间、参与人;超过 10 条只展示前 10 条
- 参与人展示:原样使用接口返回的 字段(完全与接口返回的格式保持一致,如返回
attendees[].name就展示zhangsan(张三)),不展示 useridzhangsan(张三) - 操作结果:明确告知成功/失败及原因,操作成功后展示日程摘要
- 错误提示:包含问题描述+恢复建议+备选方案,不暴露技术错误码
不可接受的输出:
- 直接展示 userid 而非姓名
- 遇到错误静默失败,不给用户任何提示
- 展示内部 schedule_id
Good output should meet the following conditions:
- Event list: Sorted in ascending order of start time, each event is output as an independent entry in order (prohibit markdown tables), each entry only includes subject, time, attendees; only display the first 10 entries if there are more than 10
- Attendee display: Use the field returned by the interface as-is (completely consistent with the format returned by the interface, e.g., display
attendees[].nameif returned aszhangsan(张三)), do not display useridzhangsan(张三) - Operation results: Clearly inform success/failure and reasons, display event summary after successful operation
- Error prompts: Include problem description + recovery suggestions + alternative solutions, do not expose technical error codes
Unacceptable output:
- Directly display userid instead of name
- Silent failure when encountering errors, no prompt to the user
- Display internal schedule_id
输出格式规范
Output Format Specifications
参与人姓名格式 [REQUIRED]:所有展示参与人的场景(创建反馈、单条摘要、列表等),姓名一律原样使用接口返回的 字段,完全与接口返回的格式保持一致(如返回 就展示 );下文模板中的 均指该原样 name。
attendees[].namezhangsan(张三)zhangsan(张三){人名}时间年份显示 [REQUIRED]:下文"时间"行默认省略年份、只到月日(模板中的 即指 );仅当日程年份与当前年份不同(跨年)时,才在月日前补上年份,格式为 。
{月日}M月D日{YYYY}年M月D日 {HH:mm}-{HH:mm}相对日期标签 [REQUIRED]:当日程日期为昨天 / 今天 / 明天时,"时间"行在月日前加上相对词,格式 (如 );其余日期按 展示。
{昨天|今天|明天} M月D日 {HH:mm}-{HH:mm}时间:明天 6月11日 14:00-15:00{月日} {HH:mm}-{HH:mm}创建成功反馈 [REQUIRED]:创建日程成功后,输出内容只包含三部分:主题、时间、参与人,禁止输出其他任何内容和额外语句(不展示地点、提醒、schedule_id 等字段,也不附加说明、建议或寒暄):
主题:{subject}
时间:{月日} {HH:mm}-{HH:mm}
参与人:{人名1}、{人名2}单条日程摘要(用于查看/搜索单条场景,非创建反馈):
主题:{subject}
时间:{月日} {HH:mm}-{HH:mm}
参与人:{人名1}、{人名2}日程列表展示规范 [REQUIRED](列表/搜索浏览均适用):
- 禁止使用 markdown 表格;每条日程作为独立条目顺序输出,按开始时间升序排序。
- 每个条目 只展示三项:主题、时间、参与人(不展示地点、提醒、schedule_id 等)。
- 超过 10 条时只展示前 10 条,并在末尾告知"还有 N 条,需要查看更多吗?"。
- 会议 / 日程 分两部分展示:判断依据是该日程是否带有会议链接——有值(非空)归为「会议」,为空 / 不存在归为「日程」(
meeting.meeting_code/search/list返回均含get字段,可直接判断)。仅当本次结果中同时存在「会议」和「日程」两类时,才把结果分成「(会议)」和「(日程)」两个部分分别展示:先列「(会议)」部分、再列「(日程)」部分;每部分内部按开始时间升序、逐条只展示主题/时间/参与人;末尾追加汇总"共 N 场,其中会议 X 场、日程 Y 场"。当结果只有单一类别时(全是会议或全是日程),不分部分、不加「(会议)」/「(日程)」标题,按普通列表直接展示。meeting - 分部分格式:
(会议)
1. {主题}
时间:{月日} {HH:mm}-{HH:mm}
参与人:{人名1}、{人名2}
(日程)
1. {主题}
时间:{月日} {HH:mm}-{HH:mm}
参与人:{人名1}、{人名2}时区标注 [REQUIRED]:日程 (非东八区)时,展示时间必须带时区标注,格式 ,如 。
timezone_offset != 28800{HH:mm}-{HH:mm}({地区中文名} UTC±N)14:00-15:00(纽约时间 UTC-5)- 由
UTC±N得出。timezone_offset / 3600 - 地区中文名由 推导(如
timezone_id→ 纽约时间);America/New_York为空时省略中文名,只留timezone_id。(UTC-5) - 东八区(,含
timezone_offset = 28800、Asia/Shanghai等)不标注,保持现状。Asia/Singapore - 适用于单条摘要的"时间"行、日程列表、创建/更新成功反馈;freebusy 的 不适用(按本人时区展示)。
slots
Attendee Name Format [REQUIRED]: In all scenarios where attendees are displayed (creation feedback, single event summary, list, etc.), names must use the field returned by the interface as-is, completely consistent with the format returned by the interface (e.g., display if returned as ); in the templates below refers to this original name.
attendees[].namezhangsan(张三)zhangsan(张三){name}Time Year Display [REQUIRED]: The "Time" line in the templates below omits the year by default, only showing month and day ( in the template refers to ); only add the year before the month and day when the event year is different from the current year (cross-year), in the format .
{month-day}M月D日{YYYY}年M月D日 {HH:mm}-{HH:mm}Relative Date Label [REQUIRED]: When the event date is yesterday / today / tomorrow, add a relative term before the month and day in the "Time" line, in the format (e.g., ); display other dates as .
{yesterday|today|tomorrow} M月D日 {HH:mm}-{HH:mm}Time: Tomorrow June 11 14:00-15:00{month-day} {HH:mm}-{HH:mm}Creation Success Feedback [REQUIRED]: After successfully creating an event, the output content only includes three parts: subject, time, attendees; prohibit outputting any other content or additional statements (do not display location, reminder, schedule_id, etc., and do not add explanations, suggestions, or greetings):
Subject: {subject}
Time: {month-day} {HH:mm}-{HH:mm}
Attendees: {name1}, {name2}Single Event Summary (for viewing/searching single event scenarios, not creation feedback):
Subject: {subject}
Time: {month-day} {HH:mm}-{HH:mm}
Attendees: {name1}, {name2}Event List Display Specifications [REQUIRED] (applicable to both list and search browsing):
- Prohibit using markdown tables; each event is output as an independent entry in order, sorted in ascending order of start time.
- Each entry only displays three items: subject, time, attendees (do not display location, reminder, schedule_id, etc.).
- Only display the first 10 entries if there are more than 10, and inform at the end "There are N more entries, do you need to view more?".
- Display meetings / events in two separate sections: Judgment is based on whether the event has a meeting link — events with non-empty are classified as "(Meeting)", empty / non-existent are classified as "(Event)" (search/list/get returns all include the
meeting.meeting_codefield, which can be directly judged). Only when both "(Meeting)" and "(Event)" categories exist in the current results should the results be divided into "(Meeting)" and "(Event)" sections for separate display: list the "(Meeting)" section first, then the "(Event)" section; each section is sorted in ascending order of start time, with each entry only displaying subject/time/attendees; add a summary at the end "Total N sessions, including X meetings and Y events". When the results are of a single category (all meetings or all events), do not divide into sections, do not add "(Meeting)" / "(Event)" titles, display directly as a normal list.meeting - Sectioned format:
(Meeting)
1. {Subject}
Time: {month-day} {HH:mm}-{HH:mm}
Attendees: {name1}, {name2}
(Event)
1. {Subject}
Time: {month-day} {HH:mm}-{HH:mm}
Attendees: {name1}, {name2}Timezone Label [REQUIRED]: When the event's (non-UTC+8), the displayed time must include a timezone label, in the format , e.g., .
timezone_offset != 28800{HH:mm}-{HH:mm} ({Chinese region name} UTC±N)14:00-15:00 (New York Time UTC-5)- is calculated by
UTC±N.timezone_offset / 3600 - The Chinese region name is derived from (e.g.,
timezone_id→ New York Time); omit the Chinese name ifAmerica/New_Yorkis empty, only keeptimezone_id.(UTC-5) - No label for UTC+8 (, including
timezone_offset = 28800,Asia/Shanghai, etc.), keep as is.Asia/Singapore - Applicable to the "Time" line of single event summaries, event lists, creation/update success feedback; not applicable to in freebusy (displayed in the user's own timezone).
slots
已知限制
Known Limitations
| 限制 | 替代方案 |
|---|---|
| schedules list 查询窗口 ≤ 前后 30 天 | |
| 不支持创建/更新/取消周期(重复)日程 | 用户希望创建"每周/每月/每天重复"等周期日程,或对已识别为周期日程( |
| 不支持回复 / 拒绝日程邀请(RSVP) | 本技能不支持对收到的日程邀请做接受 / 拒绝 / 待定等回复(含"拒绝这个日程""不参加""婉拒邀请"等)。用户有此需求时,告知其本技能不支持,建议直接在企业微信客户端对该日程邀请操作,或通过消息告知日程发起人 |
| 共同空闲查询限制 | 周期日程仅查看最近两个月有修改的;单次查询窗口 ≤ 24h,超出需分批; |
| Limitation | Alternative Solution |
|---|---|
| schedules list query window ≤ 30 days before and after | |
| Does not support creating/updating/canceling recurring events | When users want to create recurring events like "weekly/monthly/daily repeats", or initiate updates/cancellations for events identified as recurring ( |
| Does not support responding to / rejecting event invitations (RSVP) | This skill does not support accepting / rejecting / tentatively responding to received event invitations (including phrases like "Reject this event" "Will not attend" "Decline the invitation"). When users have this need, inform them that this skill does not support it, suggest operating directly on the event invitation in the WeCom client, or informing the event initiator via message. |
| Availability query limitations | Only recurring events modified in the last two months are viewed; the single query window ≤ 24h, need to split into batches if it exceeds; the part where |