新闻详情

新闻详情

首页 / 资讯中心 / 详情

WorkBuddy AI工作台实战:从模型配置到Skill开发的完整指南

发布时间:2026/9/29 17:50:40来源:尧图网络
WorkBuddy AI工作台实战:从模型配置到Skill开发的完整指南
1. 为什么我要认真聊聊 WorkBuddy 这个 AI 工作台第一次看到 WorkBuddy 这个名字我下意识以为又是一个套壳聊天窗口。真正用起来才发现它想做的事情比“聊天”大得多——它把 AI Agent 的编排、Skill 的挂载、模型配置、任务规则这些原本散落在各个工具里的东西收拢进了一个统一的工作台。你可以把它理解成一个“AI 员工的中控台”模型是员工的大脑Skill 是员工掌握的技能规则是员工必须遵守的作业规范而 WorkBuddy 就是那个派活、盯进度、管权限的调度中心。这篇内容适合三类人看。第一类是刚听说 WorkBuddy、想搞清楚它和 CodeBuddy 到底什么关系的开发者第二类是已经在用 AI Agent 做自动化、但被多工具切换折磨得够呛的效率玩家第三类是想从零搭一个属于自己的 AI Agent 工作流、却不知道从哪下手的新手。我会从安装配置讲到 Skill 编写再讲到实际踩过的坑尽量把每一步的“为什么”也讲清楚而不是只丢一堆命令让你照抄。需要先说明一点WorkBuddy 的版本迭代很快界面和配置项可能和我写的时候有出入但底层的设计逻辑——模型配置、Skill 机制、规则系统——这些核心概念是相对稳定的理解了它们界面怎么变你都能快速上手。2. WorkBuddy 到底是什么先搞清楚它和 CodeBuddy 的关系2.1 一句话定位AI Agent 的调度中台WorkBuddy 的核心定位是AI Agent 工作台。它本身不生产模型能力而是把外部模型通过models.json配置和外部技能通过 Skill 挂载组织起来让一个 Agent 能够按照你设定的规则去完成具体任务。这有点像 Jenkins 在 CI/CD 里的角色——Jenkins 自己不写代码但它调度各种构建工具、测试工具、部署脚本把它们串成一条流水线。WorkBuddy 对 AI 能力做的是同样的事。这个定位决定了它的几个关键特性。第一它是模型无关的你可以在models.json里配置多个模型按任务类型切换。第二它是技能可扩展的Skill 机制让你能把特定领域的能力比如数学建模、代码审查、文档生成封装成独立模块挂载上去。第三它是规则驱动的你可以给 WorkBuddy 定几条全局规则后续所有任务都自动生效不用每次重复交代。2.2 和 CodeBuddy 的区别一个管调度一个管编码很多人会把 WorkBuddy 和 CodeBuddy 搞混毕竟名字像、又都是腾讯系。简单说CodeBuddy 更偏向编码场景的 AI 助手聚焦在代码补全、代码生成、代码审查这些开发环节而WorkBuddy 是更上层的工作台它管的是“把哪些能力、哪些模型、哪些规则组合起来完成一类任务”编码只是它可能调度的一种任务类型。打个比方CodeBuddy 像是一个技术很硬的程序员你让他写代码他写得很好WorkBuddy 像是一个项目经理他手下可能有程序员、有设计师、有数据分析师对应不同的 Skill 和模型他负责根据任务类型派活、盯质量、保证规则被执行。两者不是替代关系而是可以配合使用——你完全可以在 WorkBuddy 里挂一个 CodeBuddy 相关的 Skill 来处理编码任务。2.3 国际版和国内版的差异认知WorkBuddy 有国际版和国内版之分这是很多教程里不太提但实际使用中必须注意的点。两个版本在模型接入、Skill 生态、界面语言上可能有差异。我的建议是如果你主要处理中文内容、需要接入国内模型服务优先用国内版如果你有海外协作需求、或者某些 Skill 只在国际版上架那就用国际版。不要两个版本混着用同一套配置models.json的字段格式和 Skill 的加载路径可能不兼容混用容易出莫名其妙的错误。3. 安装与初始配置从零把工作台跑起来3.1 安装前的环境确认WorkBuddy 支持多平台Windows、macOS、Linux 都有对应版本。Linux 用户要注意官方可能只提供特定发行版的包如果你用的是比较小众的发行版可能需要从源码构建或者用兼容层。安装前先确认三件事系统版本是否在支持列表里、磁盘剩余空间是否足够Skill 和模型缓存会占不少空间、网络环境是否能正常访问你打算接入的模型服务。我见过有人装到一半失败排查半天发现是磁盘满了。WorkBuddy 本身不大但它会缓存模型响应、Skill 依赖、任务日志用久了占用会涨得很快。建议至少留 20GB 可用空间如果你打算挂多个 Skill、跑大量任务留 50GB 以上更稳妥。3.2 安装步骤与首次启动安装过程本身不复杂下载对应平台的安装包按向导走就行。首次启动时WorkBuddy 会引导你做基础配置核心是两步配置模型接入、选择工作目录。工作目录的选择有讲究。不要选系统盘根目录也不要用带中文或空格的路径。我试过用带空格的路径结果某个 Skill 在调用外部命令时因为路径解析问题直接报错排查了很久才发现是路径里的空格没被正确转义。用纯英文、无空格的路径比如/home/user/workbuddy_workspace或D:\workbuddy_workspace能避开一大类低级问题。3.3 models.json 配置工作台的“大脑接入清单”models.json是 WorkBuddy 最核心的配置文件之一它决定了你的工作台能调用哪些模型。这个文件的结构通常是 JSON 格式每个模型条目包含模型名称、接入地址、认证信息、以及一些调用参数。配置时有几个关键点。第一认证信息不要硬编码在文件里然后提交到版本控制用环境变量引用或者单独的密钥文件这是基本的安全习惯。第二给每个模型起一个语义清晰的名字比如fast-chat、deep-reasoning、code-specialist而不是model1、model2后面在规则里引用的时候你会感谢自己。第三设置合理的超时和重试参数不同模型的响应速度差异很大统一用默认值可能导致快模型等太久、慢模型被误判超时。{ models: [ { name: fast-chat, provider: your-provider, endpoint: https://your-endpoint/v1/chat, apiKeyEnv: WORKBUDDY_FAST_KEY, timeout: 30, maxRetries: 2 }, { name: deep-reasoning, provider: your-provider, endpoint: https://your-endpoint/v1/chat, apiKeyEnv: WORKBUDDY_DEEP_KEY, timeout: 120, maxRetries: 1 } ] }注意apiKeyEnv这种写法是引用环境变量比直接写密钥安全得多。如果你不确定自己的 WorkBuddy 版本支持哪些字段先查官方文档的配置 schema不要凭感觉加字段多余的字段可能导致整个配置解析失败。3.4 首次任务验证确认工作台真的通了配置完模型后别急着挂 Skill、写规则先跑一个最简单的任务验证链路是否通畅。比如让 WorkBuddy 用fast-chat模型回答一个简单问题看它能不能正常返回。这一步能帮你快速定位问题如果连最简单的任务都失败那问题一定在模型配置或网络层面而不是 Skill 或规则层面。验证通过后再逐步加复杂度先加一个 Skill跑一个用到该 Skill 的任务再加一条规则确认规则生效。这种“逐层验证”的习惯能让你在出问题时快速缩小排查范围而不是面对一堆配置不知道哪出了问题。4. Skill 机制深度拆解工作台的“技能树”怎么点4.1 Skill 是什么把领域能力封装成可复用模块Skill 是 WorkBuddy 最值得花时间研究的部分。简单说一个 Skill 就是一段封装好的能力它告诉 WorkBuddy“当遇到某类任务时应该按什么步骤、调用什么工具、遵循什么规范来处理”。你可以把 Skill 理解成给 AI Agent 装的“专业技能包”——装了数学建模 Skill它就懂建模的套路装了代码审查 Skill它就按审查规范来干活。Skill 的价值在于复用和一致性。没有 Skill 的时候你每次让 AI 做同类任务都得在提示词里重复交代一遍要求而且每次交代的详细程度可能不一样导致输出质量不稳定。有了 Skill你把要求固化下来每次调用都按同一套标准执行输出质量就稳了。4.2 Skill 的加载方式与目录结构WorkBuddy 加载 Skill 通常有两种方式从本地目录加载、从远程仓库拉取。本地加载适合你自己写的、或者从别处下载后修改过的 Skill远程加载适合用官方或社区维护的标准 Skill。本地 Skill 的目录结构一般长这样skills/ math-modeling/ skill.json # Skill 的元信息与触发条件 prompt.md # 核心提示词模板 tools/ # 该 Skill 依赖的工具脚本 examples/ # 示例输入输出用于测试和参考skill.json是入口文件里面定义了 Skill 的名称、描述、触发关键词、依赖的工具等。prompt.md是核心它决定了这个 Skill 在干活时给模型下什么指令。tools/目录放的是 Skill 可能调用的外部脚本或程序比如数学建模 Skill 可能放一个调用求解器的脚本。4.3 编写一个自己的 Skill从需求到落地写 Skill 的第一步不是写代码而是把任务流程拆解清楚。以“代码审查 Skill”为例你得先想明白审查应该覆盖哪些维度正确性、性能、可读性、安全性每个维度下有哪些具体检查点发现问题后应该怎么输出按严重程度分级给修复建议把这些想清楚了prompt.md的内容自然就有了。第二步是定义触发条件。你希望这个 Skill 在什么时候被激活是靠关键词触发用户提到“审查代码”就激活还是靠任务类型触发检测到输入是代码就激活触发条件定义得太宽会导致 Skill 被误触发太窄又可能该触发时不触发。我的经验是先用较窄的触发条件用一段时间后根据实际误触发/漏触发的情况再调整。第三步是写 prompt.md。这里有个技巧不要只写“你要做什么”还要写“你不要做什么”。比如代码审查 Skill 里明确写“不要自动修改代码只输出审查意见”能避免 AI 越界直接改代码导致意外。负面约束往往比正面指令更能控制 AI 的行为边界。第四步是测试与迭代。拿几个典型输入跑一遍看输出是否符合预期。不符合的地方先判断是 prompt 的问题还是模型能力的问题。如果是 prompt 表述有歧义改 prompt如果是模型确实做不到那就得考虑换模型或者降低该 Skill 的能力预期。4.4 Skill 生态现状哪些 Skill 值得关注从社区讨论的热度看目前比较受关注的 Skill 类型包括代码相关代码审查、代码生成、重构建议、文档相关文档生成、格式转换、内容摘要、数据分析相关数据清洗、可视化建议、统计建模、以及一些垂直领域 Skill数学建模、特定编程语言的规范检查。选择 Skill 时我的建议是优先用经过验证的、有示例和测试用例的 Skill而不是随便找一个就用。一个没有示例、没有测试的 Skill你很难判断它的质量用起来出了问题也不好排查。另外不要一次挂太多 SkillSkill 之间可能有触发条件重叠导致 AI 不知道该用哪个。先从一两个核心 Skill 开始用顺了再逐步加。5. 规则系统给 WorkBuddy 定几条“铁律”5.1 规则的作用让 AI 记住你的偏好WorkBuddy 的规则系统解决的是一个很实际的问题你不想每次任务都重复交代同样的要求。比如你希望所有输出都用中文、所有代码都带注释、所有涉及数据的任务都先做异常值检查——这些要求如果每次都说累且容易漏写成规则一次设定后续所有任务自动生效。规则和 Skill 的区别在于Skill 是“能力”规则是“约束”。Skill 告诉 AI“你能做什么”规则告诉 AI“你必须怎么做”和“你不能怎么做”。两者配合使用才能让 AI 的输出既专业又符合你的习惯。5.2 规则的写法具体、可执行、有边界写规则最忌讳的是模糊。比如“输出要专业”这种规则AI 没法执行因为“专业”没有明确标准。好的规则应该是具体、可执行、有边界的。对比一下模糊规则具体规则输出要专业输出使用正式书面语避免口语化表达和网络用语代码要规范代码遵循 PEP 8Python或 Google StyleJava变量名用英文关键逻辑加注释注意数据质量处理数据前先检查缺失值和异常值缺失率超过 30% 的字段需在输出中标注具体规则的好处是AI 知道该怎么做你也能在输出不符合预期时明确指出“违反了哪条规则”而不是笼统地说“不够好”。5.3 规则的优先级与冲突处理当你定了多条规则可能会遇到规则冲突的情况。比如一条规则说“输出尽量简洁”另一条说“重要步骤要详细说明”那到底该简洁还是详细WorkBuddy 通常有规则优先级机制你可以在规则定义时指定优先级或者在冲突时由 AI 根据上下文判断。我的做法是把规则分成“硬规则”和“软规则”。硬规则是绝对不能违反的比如“不要输出敏感信息”“不要自动执行删除操作”软规则是尽量遵守的比如“输出尽量简洁”。硬规则优先级最高软规则之间如果冲突让 AI 根据任务类型自行权衡。这样既保证了安全底线又给了 AI 一定的灵活空间。5.4 规则生效范围全局规则与任务级规则规则可以设成全局生效也可以只在特定任务中生效。全局规则适合那些“任何时候都适用”的要求比如语言偏好、安全约束。任务级规则适合特定场景比如“处理财务数据时所有金额保留两位小数”。我建议全局规则尽量少而精只放那些真正跨任务通用的要求。全局规则太多会占用 AI 的“注意力”而且规则之间冲突的概率也更大。任务级规则可以多一些因为它们是按需加载的不会互相干扰。6. 实操全流程从零跑通一个完整任务6.1 任务场景设定用 WorkBuddy 生成一份技术文档为了把前面的配置、Skill、规则串起来我拿一个具体场景走一遍用 WorkBuddy 生成一份技术文档。这个任务会用到模型配置选一个适合长文本生成的模型、一个文档生成 Skill、以及几条规则输出格式、语言、安全约束。6.2 配置检查清单在开始任务前先过一遍配置清单models.json里已配置至少一个模型且验证可用文档生成 Skill 已放入skills/目录skill.json格式正确全局规则已设定语言、安全约束任务级规则已准备文档格式要求、章节结构要求工作目录路径无中文、无空格这个清单看起来简单但实际中十次有八次出问题都是因为某一项没检查。养成任务前过清单的习惯能省下大量排查时间。6.3 任务执行与过程观察任务启动后不要干等着。观察 WorkBuddy 的执行日志看它选了哪个模型、激活了哪个 Skill、应用了哪些规则。这些信息在出问题时是排查的关键线索。如果任务执行到一半卡住或者输出明显不对先看日志里有没有报错。常见的错误类型包括模型调用超时网络问题或模型服务问题、Skill 加载失败路径问题或格式问题、规则解析失败语法问题。根据错误类型去对应的配置里找原因比盲目重试有效得多。6.4 输出验收与迭代任务完成后对照你的规则和预期验收输出。验收时重点看规则有没有被遵守、Skill 的能力有没有被正确发挥、输出质量是否稳定。如果有问题先判断是配置问题还是模型能力问题再决定是改配置还是换模型。迭代的时候一次只改一个变量。比如你发现输出格式不对那就只改格式相关的规则或 Skill不要同时改模型和规则否则你无法判断是哪个改动起了作用。这个原则在调试任何复杂系统时都适用。7. 常见问题与避坑指南7.1 安装与启动类问题问题安装后启动报错提示缺少依赖。排查思路先看报错信息里提到的依赖名称确认是否已安装。Linux 下常见的是缺少某些系统库用包管理器装上即可。Windows 下可能是缺少运行库装对应的 VC Redistributable 通常能解决。问题启动后界面空白或卡在加载页。排查思路大概率是模型配置有问题导致初始化失败。检查models.json格式是否正确用 JSON 校验工具验一下检查环境变量是否已设置。如果配置没问题看日志里有没有网络相关的报错。7.2 Skill 相关类问题问题Skill 加载了但不生效。排查思路先确认 Skill 的触发条件是否匹配当前任务。如果触发条件靠关键词检查任务描述里有没有包含这些关键词。如果触发条件靠任务类型检查 WorkBuddy 是否正确识别了任务类型。另外检查 Skill 之间是否有冲突多个 Skill 同时匹配时可能互相干扰。问题Skill 执行时报错提示找不到工具。排查思路检查skill.json里定义的工具路径是否正确工具脚本是否有可执行权限Linux 下常见问题。如果工具依赖外部程序确认外部程序已安装且在 PATH 里。7.3 模型配置类问题问题模型调用超时。排查思路先确认网络能正常访问模型服务地址。如果网络没问题检查timeout设置是否太短长文本生成任务可能需要更长的超时时间。另外有些模型服务对并发请求有限制如果你同时跑多个任务可能触发限流导致超时。问题模型返回内容不符合预期。排查思路先确认你用的模型是否适合当前任务类型。不同模型擅长的领域不同用聊天模型做复杂推理可能效果不好。如果模型选对了但输出仍不理想检查 prompt 和规则是否有歧义尝试把要求写得更具体。7.4 规则类问题问题规则定了但不生效。排查思路检查规则的语法是否正确有些规则系统对格式要求严格格式错了会被静默忽略。检查规则的生效范围设置是否正确全局规则和任务级规则的加载时机不同设错了范围可能导致规则没被加载。问题多条规则冲突导致输出混乱。排查思路梳理所有生效的规则找出互相矛盾的地方。给规则排优先级硬规则优先于软规则。如果两条软规则确实无法同时满足考虑把其中一条改成任务级规则只在特定场景下生效。7.5 性能与稳定性类问题问题任务跑得越来越慢。排查思路检查工作目录下的缓存和日志文件是否占用过多空间定期清理。检查是否有僵尸进程占用资源。如果挂了多个 Skill检查是否有 Skill 在后台持续运行占用资源。问题任务偶尔失败重试又好了。排查思路这种间歇性问题通常和网络或模型服务的稳定性有关。可以适当增加重试次数但不要设太多否则失败任务会卡很久。如果频繁出现考虑换一个更稳定的模型服务。8. 我踩过的坑与实操心得8.1 路径问题是最容易被忽视的坑前面提过路径不要带中文和空格这里再强调一次因为这个问题太常见了。我见过有人把工作目录设在“我的文档”下面结果 Skill 调用外部工具时路径解析出错排查了半天才发现是中文路径的问题。纯英文、无空格、层级不要太深的路径能避开一大类问题。8.2 不要一次挂太多 Skill新手容易犯的错是看到什么 Skill 都想挂上觉得功能越多越好。实际上 Skill 多了之后触发条件重叠的概率大增AI 经常不知道该用哪个 Skill或者用了不合适的 Skill 导致输出质量下降。我的建议是核心 Skill 不超过三个其他 Skill 按需临时加载用完就卸。8.3 规则要定期回顾和清理规则用久了会积累有些规则可能已经过时或者不再需要。定期回顾规则列表删掉不再用的合并重复的调整优先级。规则太多不仅占用 AI 的注意力也增加冲突的概率。我一般每个月清理一次规则保持规则列表精简。8.4 日志是你的好朋友出问题时第一件事是看日志。WorkBuddy 的日志通常会记录模型调用、Skill 加载、规则应用等关键信息。养成看日志的习惯能让你从“猜问题”变成“定位问题”排查效率天差地别。如果日志级别可以调调试阶段把级别调细一点能看到更多细节。8.5 版本升级前先备份配置WorkBuddy 版本迭代快升级后配置格式可能有变化。升级前把models.json、skills/目录、规则配置都备份一份升级后如果发现配置不兼容可以快速回滚或者对照修改。我吃过一次亏升级后 Skill 目录结构变了原来的 Skill 全部加载失败因为没有备份只能重新配。8.6 从简单任务开始逐步加复杂度不要一上来就搭一个涉及多个 Skill、多条规则、多个模型的复杂工作流。先从最简单的任务开始跑通了再加一个 Skill再跑通了再加一条规则。每加一个东西就验证一次确保你知道每个组件的作用和影响。这种渐进式的搭建方式虽然前期慢一点但后期出问题时排查成本低得多。8.7 社区 Skill 要用但要有判断社区里有很多现成的 Skill 可以直接用这是好事但不要无脑用。下载一个 Skill 后先看它的prompt.md写了什么看它的示例输入输出是否符合你的预期有条件的话在自己的测试任务上跑一遍。有些 Skill 可能是针对特定场景写的直接拿来用在你的场景里可能水土不服。8.8 模型选择要匹配任务类型不是所有任务都适合用同一个模型。简单问答用快模型复杂推理用强模型长文本生成用擅长长文本的模型。在models.json里配置多个模型在规则或 Skill 里指定任务类型对应的模型能让每个任务都用上最合适的“大脑”。这比所有任务都用同一个模型效果和成本都会好很多。9. 后续可以怎么扩展WorkBuddy 的玩法远不止我上面讲的这些。如果你已经把基础流程跑通了可以尝试几个扩展方向。一是自定义 Skill 开发把你工作中重复性高的任务封装成 Skill一次开发多次复用。二是多 Agent 协作WorkBuddy 支持配置多个 Agent你可以让不同 Agent 负责不同环节串成一条完整的流水线。三是与外部系统集成通过 Skill 调用外部 API 或命令行工具把 WorkBuddy 接入你现有的工作流里。我个人在实际操作中的体会是WorkBuddy 这类工具的价值不在于它本身有多强大而在于它能把分散的 AI 能力组织起来让你用一套统一的规则和流程去管理。刚开始配置会花一些时间但配置好了之后每次任务的效率提升是实实在在的。别怕前期麻烦把基础打牢后面就是享受复利的时候了。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Windows上制作arm64 deb包:从工具选择到避坑实操 2026/9/29 20:43:00

Windows上制作arm64 deb包:从工具选择到避坑实操

1. 先搞清楚:在 Windows 上打 arm64 的 deb,到底算什么任务1.1 三种不同类型的“打包”需求很多人一看到"在 Windows 上打出 arm64 的 deb 包"这句话,第一反应就是:你是不是闲得慌?我当时也是这么想的。事情…

阅读更多 →
5分钟跑通Siftly:一条命令部署你的本地Twitter书签管理神器 2026/9/29 20:43:00

5分钟跑通Siftly:一条命令部署你的本地Twitter书签管理神器

5分钟跑通Siftly:一条命令部署你的本地Twitter书签管理神器 【免费下载链接】Siftly Local Twitter/X bookmark organizer with AI categorization and mindmap visualization 项目地址: https://gitcode.com/gh_mirrors/si/Siftly Siftly 是一款完全运行在你…

阅读更多 →
AgentScope多智能体框架实战:消息传递、工作流编排与RAG集成 2026/9/29 20:42:53

AgentScope多智能体框架实战:消息传递、工作流编排与RAG集成

1. 为什么我会盯上 AgentScope 这个多智能体框架第一次听到 AgentScope 这个名字,是在一个做智能客服系统的朋友那里。他当时吐槽说,用某几个主流框架搭多智能体协作,光是消息传递和状态同步就写了一堆胶水代码,调试的时候日志乱成…

阅读更多 →
MarkItDown 复杂表单式 PDF 转 Markdown 实战解析:以影院订场订单(movie-theater-booking-2024)为例 2026/9/29 20:42:53

MarkItDown 复杂表单式 PDF 转 Markdown 实战解析:以影院订场订单(movie-theater-booking-2024)为例

人工智能AI 应用MCP 服务 【免费下载链接】markitdown Python tool for converting files and office documents to Markdown. 项目地址: https://gitcode.com/GitHub_Trending/ma/markitdown 点击查看 免费下载 MarkItDown 是当前仓库提供的一个 Python 包与命令行…

阅读更多 →
Excel一键生成柱状图全攻略:从快捷键到动态更新 2026/9/29 20:42:53

Excel一键生成柱状图全攻略:从快捷键到动态更新

做了这么多年数据汇报,我见过太多人抱着Excel点半天也做不出一张像样的柱状图。一说到“一键生成图表”,很多人以为是多神秘的功能,其实Excel从早期版本至今一直都有直接出图的快捷键,真正的问题从来不是“能不能一键”&#xff0…

阅读更多 →
Harness 核心原理 5|Instruction 指令层:用 AGENTS.md 与 System Prompt 给 AI 立规矩、定人设 2026/9/29 20:42:46

Harness 核心原理 5|Instruction 指令层:用 AGENTS.md 与 System Prompt 给 AI 立规矩、定人设

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉