[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-Yoctol--bottender":3,"tool-Yoctol--bottender":64},[4,17,27,35,43,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,3,"2026-04-05T11:01:52",[13,14,15],"开发框架","图像","Agent","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":23,"last_commit_at":24,"category_tags":25,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",138956,2,"2026-04-05T11:33:21",[13,15,26],"语言模型",{"id":28,"name":29,"github_repo":30,"description_zh":31,"stars":32,"difficulty_score":23,"last_commit_at":33,"category_tags":34,"status":16},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107662,"2026-04-03T11:11:01",[13,14,15],{"id":36,"name":37,"github_repo":38,"description_zh":39,"stars":40,"difficulty_score":23,"last_commit_at":41,"category_tags":42,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,26],{"id":44,"name":45,"github_repo":46,"description_zh":47,"stars":48,"difficulty_score":23,"last_commit_at":49,"category_tags":50,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[14,51,52,53,15,54,26,13,55],"数据工具","视频","插件","其他","音频",{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":10,"last_commit_at":62,"category_tags":63,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,"2026-04-04T04:44:48",[15,14,13,26,54],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":69,"readme_en":70,"readme_zh":71,"quickstart_zh":72,"use_case_zh":73,"hero_image_url":74,"owner_login":75,"owner_name":76,"owner_avatar_url":77,"owner_bio":78,"owner_company":79,"owner_location":79,"owner_email":80,"owner_twitter":79,"owner_website":81,"owner_url":82,"languages":83,"stars":100,"forks":101,"last_commit_at":102,"license":103,"difficulty_score":23,"env_os":104,"env_gpu":105,"env_ram":105,"env_deps":106,"category_tags":110,"github_topics":111,"view_count":121,"oss_zip_url":79,"oss_zip_packed_at":79,"status":16,"created_at":122,"updated_at":123,"faqs":124,"releases":155},421,"Yoctol\u002Fbottender","bottender","⚡️ A framework for building conversational user interfaces.","Bottender 是一个用于构建对话式用户界面（如聊天机器人）的开源框架，基于 Node.js 开发。它帮助开发者轻松对接主流消息平台（如 Facebook Messenger、LINE 等），省去处理 Webhook 验证、消息解析、多渠道适配等繁琐细节。通过声明式的编程方式，开发者只需定义不同用户输入或状态下的响应逻辑，Bottender 会自动调度执行，使代码更清晰、易维护。  \n\n它特别适合希望快速开发跨平台聊天机器人的前端或全栈开发者使用，无需深入各平台底层协议。Bottender 内置对多个消息通道的原生支持，提供生产级特性如请求批处理、自动服务器配置和签名验证，并已在数千个实际项目中验证稳定性。此外，其配套的 CLI 工具可一键初始化项目，大幅降低入门门槛。","# Bottender\n\n[![npm](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fbottender.svg)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fbottender)\n[![Build Status](https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender\u002Fworkflows\u002FNode.js%20CI\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender\u002Factions?query=workflow%3ANode.js%20CI+branch%3Amaster)\n[![coverage](https:\u002F\u002Fcodecov.io\u002Fgh\u002FYoctol\u002Fbottender\u002Fbranch\u002Fmaster\u002Fgraph\u002Fbadge.svg)](https:\u002F\u002Fcodecov.io\u002Fgh\u002FYoctol\u002Fbottender)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-blue.svg)](https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT)\n[![PRs Welcome](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPRs-welcome-brightgreen.svg)](https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender#contributing)\n[![join chat](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdiscord-join%20chat-green.svg)](https:\u002F\u002Fdiscord.gg\u002FapNsWBz)\n[![Gitpod Ready-to-Code](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGitpod-Ready--to--Code-blue?logo=gitpod)](https:\u002F\u002Fgitpod.io\u002F#https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender)\n[![Follow @bottenderjs](https:\u002F\u002Fimg.shields.io\u002Ftwitter\u002Ffollow\u002Fbottenderjs.svg?label=Follow%20@bottenderjs)](https:\u002F\u002Ftwitter.com\u002Fintent\u002Ffollow?screen_name=bottenderjs)\n\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FYoctol_bottender_readme_fa4747708fa1.png)\n\n> The readme below is the documentation for the v1 (stable) version of Bottender. To view the documentation:\n>\n> - for the latest Bottender version (v1.x), visit https:\u002F\u002Fbottender.js.org\u002Fdocs\u002F\n> - for the legacy Bottender version (v0.15), visit https:\u002F\u002Fbottender.js.org\u002Fdocs\u002F0.15.17\u002F\n\n- **Declarative** - Bottender takes care of the complexity of conversational UIs for you. Design actions for each event and state in your application, and Bottender will run accordingly. This approach makes your code more predictable and easier to debug.\n\n- **Native User Experience** - Bottender lets you create apps on every channel and never compromise on your users’ experience. You can apply progressive enhancement or graceful degradation strategy on your building blocks.\n\n- **Easy Setup** - With Bottender, you only need a few configurations to make your bot work with channels, automatic server listening, webhook setup, signature verification and so much more.\n\n- **Ready for Production** - There are thousands of bots powered by Bottender. It has been optimized for real world use cases, automatic batching request and dozens of other compelling features.\n\nBottender is built on top of\n[Messaging APIs](https:\u002F\u002Fgithub.com\u002Fbottenderjs\u002Fmessaging-apis).\n\n## Installation\n\nYou can create a new Bottender app using the CLI tools:\n\n```sh\nnpx create-bottender-app my-app\n```\n\nInstallation may fail on Windows during compilation of the native dependencies with `node-gyp`. To solve this problem, you can install [`windows-build-tools`](https:\u002F\u002Fgithub.com\u002Ffelixrieseberg\u002Fwindows-build-tools#readme) or check [`node-gyp` documentation](https:\u002F\u002Fgithub.com\u002Fnodejs\u002Fnode-gyp#on-windows).\n\n## Documentation\n\nYou can find the Bottender documentation [on the website](https:\u002F\u002Fbottender.js.org?new).\n\nCheck out the [Getting Started](https:\u002F\u002Fbottender.js.org\u002Fdocs) page for a quick overview.\n\n## Community\n\n[![join chat](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdiscord-join%20chat-green.svg)](https:\u002F\u002Fdiscord.gg\u002FunmFzmR)\n\nYou can discuss anything about Bottender or chatbot development in our [Discord](https:\u002F\u002Fdiscordapp.com\u002F) Server. [Join now!](https:\u002F\u002Fdiscord.gg\u002FunmFzmR)\n\n## Examples\n\nWe have a bunch of examples in the\n[examples](https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender\u002Ftree\u002Fmaster\u002Fexamples) folder.\nHere is the first one to get you started:\n\n```js\n\u002F\u002F index.js\nconst { router, text } = require('bottender\u002Frouter');\n\nasync function SayHi(context) {\n  await context.sendText('Hi!');\n}\n\nasync function Unknown(context) {\n  await context.sendText('Sorry, I don’t know what you say.');\n}\n\nmodule.export = function App(context) {\n  return router([text('hi', SayHi), text('*', Unknown)]);\n};\n```\n\n## Notable Features\n\n### Messenger\n\n- Messenger Profile Sync\n- Attachment Upload\n- Handover Protocol\n- Persona\n- Built-in NLP\n- Multiple Pages\n\n### LINE\n\n- Reply, Push, Multicast, Narrowcast\n- Imagemap\n- Rich menu\n- Room, Group Chat\n- Beacon\n- Icon Switch\n- Line Notify\n- LIFF (LINE Front-end Framework)\n\n### Slack\n\n- Channel Chat\n- Interactive Message\n- Slash Command\n\n### Telegram\n\n- Webhook, Long Polling\n- Updating, Deleting Messages\n- Keyboard\n- Group Chat\n- Inline Query\n- Message Live Location\n- Payment\n\n### Viber\n\n- Subscribed, Unsubscribed Event\n- Delivered, Seen Event\n\n## Ecosystem\n\n- [bottender-compose](https:\u002F\u002Fgithub.com\u002Fbottenderjs\u002Fbottender-compose) - An utility library for Bottender and higher-order handlers.\n\n## Contributing\n\nPull Requests and issue reports are welcome. You can follow steps below to submit your pull requests:\n\nFork, then clone the repo:\n\n```sh\ngit clone git@github.com:your-username\u002Fbottender.git\n```\n\nInstall the dependencies:\n\n```sh\ncd bottender\nyarn\n```\n\nMake sure the tests pass (including ESLint, TypeScript checks and Jest tests):\n\n```sh\nyarn test\n```\n\nMake your changes and tests, and make sure the tests pass.\n\n### Contribute using the online one-click setup\n\nYou can use Gitpod(a free online VS Code-like) for contributing. With a single click it will launch a workspace and automatically:\n\n- clone the bottender repo.\n- install the dependencies.\n- run `yarn run start`.\n\nSo that you can start straight away.\n\n[![Open in Gitpod](https:\u002F\u002Fgitpod.io\u002Fbutton\u002Fopen-in-gitpod.svg)](https:\u002F\u002Fgitpod.io\u002F#https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender)\n\n## License\n\nMIT © [Yoctol](https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender)\n","# Bottender\n\n[![npm](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Fbottender.svg)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fbottender)\n[![Build Status](https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender\u002Fworkflows\u002FNode.js%20CI\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender\u002Factions?query=workflow%3ANode.js%20CI+branch%3Amaster)\n[![coverage](https:\u002F\u002Fcodecov.io\u002Fgh\u002FYoctol\u002Fbottender\u002Fbranch\u002Fmaster\u002Fgraph\u002Fbadge.svg)](https:\u002F\u002Fcodecov.io\u002Fgh\u002FYoctol\u002Fbottender)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-blue.svg)](https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT)\n[![PRs Welcome](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPRs-welcome-brightgreen.svg)](https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender#contributing)\n[![join chat](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdiscord-join%20chat-green.svg)](https:\u002F\u002Fdiscord.gg\u002FapNsWBz)\n[![Gitpod Ready-to-Code](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGitpod-Ready--to--Code-blue?logo=gitpod)](https:\u002F\u002Fgitpod.io\u002F#https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender)\n[![Follow @bottenderjs](https:\u002F\u002Fimg.shields.io\u002Ftwitter\u002Ffollow\u002Fbottenderjs.svg?label=Follow%20@bottenderjs)](https:\u002F\u002Ftwitter.com\u002Fintent\u002Ffollow?screen_name=bottenderjs)\n\n![](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FYoctol_bottender_readme_fa4747708fa1.png)\n\n> 以下 README 是 Bottender v1（稳定版）的文档。如需查看其他版本的文档，请访问：\n>\n> - 最新 Bottender 版本（v1.x）：https:\u002F\u002Fbottender.js.org\u002Fdocs\u002F\n> - 旧版 Bottender（v0.15）：https:\u002F\u002Fbottender.js.org\u002Fdocs\u002F0.15.17\u002F\n\n- **声明式（Declarative）** - Bottender 为你处理对话式用户界面（conversational UIs）的复杂性。你只需为应用中的每个事件和状态设计对应的操作（actions），Bottender 会自动执行。这种方式使你的代码更具可预测性，也更容易调试。\n\n- **原生用户体验（Native User Experience）** - Bottender 让你能在所有渠道上构建应用，同时绝不牺牲用户的体验。你可以对构建模块采用渐进增强（progressive enhancement）或优雅降级（graceful degradation）策略。\n\n- **轻松设置（Easy Setup）** - 使用 Bottender，你只需少量配置即可让机器人与各渠道对接，包括自动服务器监听、Webhook 设置、签名验证等。\n\n- **生产就绪（Ready for Production）** - 已有数千个机器人基于 Bottender 构建。它针对真实世界用例进行了优化，支持自动批量请求（automatic batching request）等众多强大功能。\n\nBottender 基于 [Messaging APIs](https:\u002F\u002Fgithub.com\u002Fbottenderjs\u002Fmessaging-apis) 构建。\n\n## 安装\n\n你可以使用 CLI 工具创建一个新的 Bottender 应用：\n\n```sh\nnpx create-bottender-app my-app\n```\n\n在 Windows 上安装时，可能会因 `node-gyp` 编译原生依赖失败。要解决此问题，你可以安装 [`windows-build-tools`](https:\u002F\u002Fgithub.com\u002Ffelixrieseberg\u002Fwindows-build-tools#readme)，或查阅 [`node-gyp` 文档](https:\u002F\u002Fgithub.com\u002Fnodejs\u002Fnode-gyp#on-windows)。\n\n## 文档\n\n你可以在 [官方网站](https:\u002F\u002Fbottender.js.org?new) 找到 Bottender 的完整文档。\n\n快速入门请查看 [Getting Started](https:\u002F\u002Fbottender.js.org\u002Fdocs) 页面。\n\n## 社区\n\n[![join chat](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdiscord-join%20chat-green.svg)](https:\u002F\u002Fdiscord.gg\u002FunmFzmR)\n\n你可以在我们的 [Discord](https:\u002F\u002Fdiscordapp.com\u002F) 服务器中讨论任何关于 Bottender 或聊天机器人开发的话题。[立即加入！](https:\u002F\u002Fdiscord.gg\u002FunmFzmR)\n\n## 示例\n\n我们在 [examples](https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender\u002Ftree\u002Fmaster\u002Fexamples) 文件夹中提供了大量示例。以下是最简单的入门示例：\n\n```js\n\u002F\u002F index.js\nconst { router, text } = require('bottender\u002Frouter');\n\nasync function SayHi(context) {\n  await context.sendText('Hi!');\n}\n\nasync function Unknown(context) {\n  await context.sendText('Sorry, I don’t know what you say.');\n}\n\nmodule.export = function App(context) {\n  return router([text('hi', SayHi), text('*', Unknown)]);\n};\n```\n\n## 主要功能\n\n### Messenger\n\n- Messenger Profile 同步\n- 附件上传（Attachment Upload）\n- 转交协议（Handover Protocol）\n- Persona\n- 内置 NLP（Built-in NLP）\n- 多页面支持（Multiple Pages）\n\n### LINE\n\n- 回复、推送、多播、窄播（Reply, Push, Multicast, Narrowcast）\n- 图片地图（Imagemap）\n- 富菜单（Rich menu）\n- 房间与群组聊天（Room, Group Chat）\n- Beacon\n- 图标切换（Icon Switch）\n- Line Notify\n- LIFF（LINE Front-end Framework）\n\n### Slack\n\n- 频道聊天（Channel Chat）\n- 交互式消息（Interactive Message）\n- 斜杠命令（Slash Command）\n\n### Telegram\n\n- Webhook 与长轮询（Webhook, Long Polling）\n- 更新与删除消息（Updating, Deleting Messages）\n- 键盘（Keyboard）\n- 群组聊天（Group Chat）\n- 内联查询（Inline Query）\n- 消息实时位置（Message Live Location）\n- 支付（Payment）\n\n### Viber\n\n- 订阅\u002F取消订阅事件（Subscribed, Unsubscribed Event）\n- 已送达\u002F已读事件（Delivered, Seen Event）\n\n## 生态系统\n\n- [bottender-compose](https:\u002F\u002Fgithub.com\u002Fbottenderjs\u002Fbottender-compose) - 一个用于 Bottender 和高阶处理器（higher-order handlers）的工具库。\n\n## 贡献\n\n欢迎提交 Pull Request 和问题报告。你可以按照以下步骤提交 PR：\n\n先 Fork 并克隆仓库：\n\n```sh\ngit clone git@github.com:your-username\u002Fbottender.git\n```\n\n安装依赖：\n\n```sh\ncd bottender\nyarn\n```\n\n确保所有测试通过（包括 ESLint、TypeScript 检查和 Jest 测试）：\n\n```sh\nyarn test\n```\n\n进行修改并添加测试，确保测试仍然通过。\n\n### 使用在线一键设置进行贡献\n\n你可以使用 Gitpod（一个免费的在线 VS Code 类似环境）进行贡献。只需点击一次，它将自动：\n\n- 克隆 bottender 仓库\n- 安装依赖\n- 运行 `yarn run start`\n\n让你立即开始开发。\n\n[![Open in Gitpod](https:\u002F\u002Fgitpod.io\u002Fbutton\u002Fopen-in-gitpod.svg)](https:\u002F\u002Fgitpod.io\u002F#https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender)\n\n## 许可证\n\nMIT © [Yoctol](https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender)","# Bottender 快速上手指南\n\n## 环境准备\n\n- **操作系统**：Windows \u002F macOS \u002F Linux 均可\n- **Node.js**：建议使用 v14 或更高版本（推荐 LTS 版本）\n- **npm \u002F yarn**：确保已安装包管理工具（推荐使用 `yarn`）\n\n> 💡 **国内用户提示**：  \n> 若安装速度较慢，可配置 npm 或 yarn 使用国内镜像源（如淘宝 NPM 镜像）：\n> ```sh\n> npm config set registry https:\u002F\u002Fregistry.npmmirror.com\n> # 或使用 yarn\n> yarn config set registry https:\u002F\u002Fregistry.npmmirror.com\n> ```\n\n> ⚠️ **Windows 用户注意**：  \n> 安装时若遇到 `node-gyp` 编译错误，请先安装构建工具：\n> ```sh\n> npm install -g windows-build-tools\n> ```\n\n## 安装步骤\n\n使用官方 CLI 快速创建新项目：\n\n```sh\nnpx create-bottender-app my-app\n```\n\n进入项目目录并启动开发服务器：\n\n```sh\ncd my-app\nnpm start\n# 或\nyarn start\n```\n\n## 基本使用\n\n以下是最简示例，实现一个能响应 “hi” 的聊天机器人：\n\n```js\n\u002F\u002F index.js\nconst { router, text } = require('bottender\u002Frouter');\n\nasync function SayHi(context) {\n  await context.sendText('Hi!');\n}\n\nasync function Unknown(context) {\n  await context.sendText('Sorry, I don’t know what you say.');\n}\n\nmodule.exports = function App(context) {\n  return router([text('hi', SayHi), text('*', Unknown)]);\n};\n```\n\n将上述代码保存为 `index.js`，配合 Bottender 项目模板即可运行。当用户发送 “hi” 时，机器人回复 “Hi!”；其他消息则返回未知提示。\n\n> 📚 更多用法请参考官方文档：[https:\u002F\u002Fbottender.js.org\u002Fdocs](https:\u002F\u002Fbottender.js.org\u002Fdocs)","一家本地连锁咖啡店希望为顾客提供微信和 LINE 双平台的智能客服机器人，用于处理常见问题（如营业时间、菜单查询）和订单状态跟踪。\n\n### 没有 bottender 时\n- 需要分别对接微信和 LINE 的 API，处理不同的消息格式、认证机制和 webhook 验证逻辑，代码重复且维护困难。\n- 对话流程用 if-else 或 switch 硬编码，随着业务复杂度上升（如“查订单”需多轮确认手机号），逻辑混乱难以扩展。\n- 缺乏统一的状态管理机制，用户中途切换话题或重试操作时，上下文容易丢失，体验割裂。\n- 每次新增功能（如上传订单截图）都要手动处理附件解析、存储和跨平台兼容性，开发效率低。\n- 测试和调试需在真实聊天界面反复操作，缺乏本地快速验证能力。\n\n### 使用 bottender 后\n- 通过统一抽象层同时支持微信和 LINE，只需编写一套对话逻辑，bottender 自动适配各平台协议。\n- 利用声明式路由（如 `text('菜单', showMenu)`）清晰定义用户意图与响应动作，多轮对话通过 session 状态自然衔接。\n- 内置上下文（context）和会话（session）管理，自动保留用户交互状态，即使中断也能恢复流程。\n- 附件上传、富媒体消息等高级功能开箱即用，无需重复造轮子。\n- 支持本地开发服务器和模拟请求，开发者可在终端快速测试对话流，大幅缩短迭代周期。\n\nbottender 让团队用一套简洁、可维护的代码，高效构建跨平台、体验一致的对话式服务。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002FYoctol_bottender_fa474770.png","Yoctol","YOCTOL.AI","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002FYoctol_4ced8875.png","",null,"service@yoctol.com","https:\u002F\u002Fyoctol.ai","https:\u002F\u002Fgithub.com\u002FYoctol",[84,88,92,96],{"name":85,"color":86,"percentage":87},"TypeScript","#3178c6",98.3,{"name":89,"color":90,"percentage":91},"JavaScript","#f1e05a",1,{"name":93,"color":94,"percentage":95},"CSS","#663399",0.6,{"name":97,"color":98,"percentage":99},"Shell","#89e051",0,4281,336,"2026-04-02T11:22:58","MIT","Linux, macOS, Windows","未说明",{"notes":107,"python":105,"dependencies":108},"基于 Node.js 构建，需安装 Node.js 环境；在 Windows 上安装时可能需要 windows-build-tools 来编译原生依赖；可通过 npx create-bottender-app 快速创建项目。",[109],"node-gyp",[26,13,54,51],[112,113,114,115,116,117,118,119,120],"messaging","messenger","line","slack","telegram","bot","chatbot","framework","viber",8,"2026-03-27T02:49:30.150509","2026-04-06T05:16:42.320811",[125,130,135,140,145,150],{"id":126,"question_zh":127,"answer_zh":128,"source_url":129},1592,"如何解决 Twilio WhatsApp 配置时出现的 400 Bad Request 和 11200 HTTP retrieval failure 错误？","确保在 Twilio 控制台中清空「STATUS CALLBACK URL」字段（即使文档中建议填写），否则会导致签名验证失败。此外，需正确设置环境变量（如 WHATSAPP_PHONE_NUMBER=\"whatsapp:+xxxxxxxxxxx\"）并使用 Bottender 提供的 bodyParser 中间件（含 verify 函数）以正确处理请求体。","https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender\u002Fissues\u002F728",{"id":131,"question_zh":132,"answer_zh":133,"source_url":134},1593,"如何创建自定义消息提供者（Custom Provider）？","Bottender 官方提供了「CustomConnector」指南文档，说明了如何扩展和实现自己的连接器。可参考 ConsoleBot 示例，并查阅官方文档：https:\u002F\u002Fbottender.js.org\u002Fdocs\u002FGuides-CustomConnector。","https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender\u002Fissues\u002F227",{"id":136,"question_zh":137,"answer_zh":138,"source_url":139},1594,"如何在 Bottender 中组合多个事件处理器（Handler）或实现多层逻辑判断？","可以使用 bottender-compose 的 condition 等工具进行组合，但若需根据 context.state 或调用第三方服务决定流程，建议直接在 handler 函数内编写条件逻辑。同时可启用 DEBUG 环境变量查看实际接收到的事件，帮助调试：`DEBUG=bottender:* npm start`。","https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender\u002Fissues\u002F342",{"id":141,"question_zh":142,"answer_zh":143,"source_url":144},1595,"Facebook Messenger 是否支持上传 PDF 文件？遇到 'Cannot read property 'data' of undefined' 错误怎么办？","Messenger 支持上传 PDF 文件。该错误是 Bottender 早期版本中的一个 bug，已在 v0.15.0-rc.4 及后续版本中修复，请升级到最新版 Bottender 即可解决。","https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender\u002Fissues\u002F298",{"id":146,"question_zh":147,"answer_zh":148,"source_url":149},1596,"Messenger 的 postback 按钮点击后未触发 onEvent，如何排查？","首先确认 Facebook 应用已启用「messaging_postbacks」事件。其次，检查是否因多个 webhook 配置导致按钮绑定到错误的后端。可通过 curl 手动发送 postback 请求测试，并使用 DEBUG=bottender:* 查看实际接收的事件。注意：postback 和文本消息可能被分别触发。","https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender\u002Fissues\u002F152",{"id":151,"question_zh":152,"answer_zh":153,"source_url":154},1597,"为什么 context.session.user 中无法获取用户的 locale 字段，即使已获得 Facebook 审核权限？","从 Bottender v1 开始，默认不再自动获取用户详细信息（包括 locale）。如需获取，必须显式调用 `context.getUserProfile({ fields: ['locale'] })` 并手动保存到 session 中。","https:\u002F\u002Fgithub.com\u002FYoctol\u002Fbottender\u002Fissues\u002F395",[156,161,166,171,176,181,186,191,196,201,206,211,216,221,226,231,236,241,246,251],{"id":157,"version":158,"summary_zh":159,"released_at":160},101115,"v1.5.5","- [deps] use forked `@bottender\u002Fjfs` instead of unmaintained `jfs`.\r\n","2021-11-10T09:49:05",{"id":162,"version":163,"summary_zh":164,"released_at":165},101116,"v1.5.4","## line\r\n\r\n[deprecated] add deprecated warning to the following methods:\r\n\r\n- `context.useAccessToken`\r\n- `context.replyButtonTemplate`\r\n- `context.push`\r\n- `context.pushText`\r\n- `context.pushImage`\r\n- `context.pushVideo`\r\n- `context.pushAudio`\r\n- `context.pushLocation`\r\n- `context.pushSticker`\r\n- `context.pushImagemap`\r\n- `context.pushFlex`\r\n- `context.pushTemplate`\r\n- `context.pushButtonTemplate`\r\n- `context.pushButtonsTemplate`\r\n- `context.pushConfirmTemplate`\r\n- `context.pushCarouselTemplate`\r\n- `context.pushImageCarouselTemplate`\r\n- `context.send`\r\n- `context.sendImage`\r\n- `context.sendVideo`\r\n- `context.sendAudio`\r\n- `context.sendLocation`\r\n- `context.sendSticker`\r\n- `context.sendImagemap`\r\n- `context.sendFlex`\r\n- `context.sendTemplate`\r\n- `context.sendButtonTemplate`\r\n- `context.sendButtonsTemplate`\r\n- `context.sendConfirmTemplate`\r\n- `context.sendCarouselTemplate`\r\n- `context.sendImageCarouselTemplate`","2021-10-11T03:51:51",{"id":167,"version":168,"summary_zh":169,"released_at":170},101117,"v1.5.3","- [deps] remove `prompt-confirm`.\r\n","2021-10-05T12:30:30",{"id":172,"version":173,"summary_zh":174,"released_at":175},101118,"v1.5.2","- [deps] update dependencies.\r\n","2021-09-30T15:37:46",{"id":177,"version":178,"summary_zh":179,"released_at":180},101119,"v1.5.1","- [new] Server: support experimental custom connectors (#781):\r\n\r\n```js\r\n\u002F\u002F bottender.config.js\r\n\r\nmodule.exports = {\r\n  channels: {\r\n    mychannel: {\r\n      enabled: true,\r\n      path: '\u002Fwebhooks\u002Fmychannel',\r\n      connector: new MyConnector(\u002F* ... *\u002F),\r\n    },\r\n  },\r\n};\r\n```\r\n\r\n- [new]: export clients, factories from `messaging-apis` (#806):\r\n\r\n```js\r\nconst {\r\n  \u002F\u002F clients\r\n  MessengerClient,\r\n  LineClient,\r\n  TelegramClient,\r\n  SlackOAuthClient,\r\n  ViberClient,\r\n  TwilioClient,\r\n\r\n  \u002F\u002F factories\r\n  Messenger,\r\n  Line,\r\n} = require('bottender');\r\n```\r\n\r\n- [new] Bot: implement the `onRequest` option (#773):\r\n\r\n```js\r\n\u002F\u002F bottender.config.js\r\n\r\nfunction onRequest(body, requestContext) {\r\n  console.log({\r\n    body,\r\n    requestContext,\r\n  });\r\n}\r\n\r\nmodule.exports = {\r\n  channels: {\r\n    messenger: {\r\n      \u002F\u002F ...\r\n      onRequest,\r\n    },\r\n    whatsapp: {\r\n      \u002F\u002F ...\r\n      onRequest,\r\n    },\r\n    line: {\r\n      \u002F\u002F ...\r\n      onRequest,\r\n    },\r\n    telegram: {\r\n      \u002F\u002F ...\r\n      onRequest,\r\n    },\r\n    slack: {\r\n      \u002F\u002F ...\r\n      onRequest,\r\n    },\r\n    viber: {\r\n      \u002F\u002F ...\r\n      onRequest,\r\n    },\r\n  },\r\n};\r\n```\r\n\r\n- [new] RequestContext: add `id` to `RequestContext` (#774)\r\n- [fix] Server: should await for `connector.preprocess` (#771)\r\n- [deps] upgrade `messaging-apis` to v1.0.0\r\n\r\n## messenger\r\n\r\n- [new] get\u002Fset\u002Fdelete user level persistent menu for context user (#790):\r\n\r\n```js\r\nawait context.getUserPersistentMenu();\r\n\u002F\u002F [\r\n\u002F\u002F   {\r\n\u002F\u002F     locale: 'default',\r\n\u002F\u002F     composerInputDisabled: false,\r\n\u002F\u002F     callToActions: [\r\n\u002F\u002F       {\r\n\u002F\u002F         type: 'postback',\r\n\u002F\u002F         title: 'Restart Conversation',\r\n\u002F\u002F         payload: 'RESTART',\r\n\u002F\u002F       },\r\n\u002F\u002F       {\r\n\u002F\u002F         type: 'web_url',\r\n\u002F\u002F         title: 'Powered by ALOHA.AI, Yoctol',\r\n\u002F\u002F         url: 'https:\u002F\u002Fwww.yoctol.com\u002F',\r\n\u002F\u002F       },\r\n\u002F\u002F     ],\r\n\u002F\u002F   },\r\n\u002F\u002F ]\r\n\r\nawait context.setUserPersistentMenu([\r\n  {\r\n    locale: 'default',\r\n    composerInputDisabled: false,\r\n    callToActions: [\r\n      {\r\n        type: 'postback',\r\n        title: 'Restart Conversation',\r\n        payload: 'RESTART',\r\n      },\r\n      {\r\n        type: 'web_url',\r\n        title: 'Powered by ALOHA.AI, Yoctol',\r\n        url: 'https:\u002F\u002Fwww.yoctol.com\u002F',\r\n      },\r\n    ],\r\n  },\r\n]);\r\n\r\nawait context.deleteUserPersistentMenu();\r\n```\r\n\r\n## line\r\n\r\n- [new] support line multi-channel using `getConfig` (#770):\r\n\r\n```js\r\n\u002F\u002F bottender.config.js\r\nmodule.exports = {\r\n  channels: {\r\n    line: {\r\n      enabled: true,\r\n      path: '\u002Fwebhooks\u002Fline\u002F:channelId',\r\n      async getConfig({ params }) {\r\n        console.log(params.channelId);\r\n        \u002F\u002F ...get the config from the API, database or wherever you like when every time receiving a new event\r\n        return {\r\n          accessToken,\r\n          channelSecret,\r\n        };\r\n      },\r\n    },\r\n  },\r\n};\r\n```\r\n\r\n- [new] add `emojis` on LINE text message event (#793):\r\n\r\n```js\r\nif (context.event.isMessage) {\r\n  context.event.message.emojis;\r\n  \u002F\u002F [\r\n  \u002F\u002F   {\r\n  \u002F\u002F     index: 14,\r\n  \u002F\u002F     length: 6,\r\n  \u002F\u002F     productId: '5ac1bfd5040ab15980c9b435',\r\n  \u002F\u002F     emojiId: '001',\r\n  \u002F\u002F   },\r\n  \u002F\u002F ]\r\n}\r\n```\r\n\r\n- [new] add `LineContext.getMembersCount` method (#824):\r\n\r\n```js\r\nawait context.getMembersCount();\r\n\u002F\u002F 10\r\n```\r\n\r\n## telegram\r\n\r\n- [new] add `TelegramEvent.isPollAnswer` and `TelegramEvent.pollAnswer` (#745):\r\n\r\n```js\r\nif (context.event.isPollAnswer) {\r\n  console.log(context.event.pollAnswer);\r\n}\r\n```\r\n\r\n- [new] add `pollAnswer` to telegram routes:\r\n\r\n```js\r\nconst { router, telegram } = require('bottender\u002Frouter');\r\n\r\nasync function HandlePollAnswer(context) {\r\n  \u002F\u002F ...\r\n}\r\n\r\nfunction App() {\r\n  return router([telegram.pollAnswer(HandlePollAnswer)]);\r\n}\r\n```\r\n\r\n- [new] add `TelegramContext.answerCallbackQuery` (#750):\r\n\r\n```js\r\nawait context.answerCallbackQuery({\r\n  url: 'https:\u002F\u002Fexample.com\u002F',\r\n});\r\n```\r\n\r\n## slack\r\n\r\n- [new] slack route accept any requests by passing `*` (#758):\r\n\r\n```js\r\nconst { router, slack } = require('bottender\u002Frouter');\r\n\r\nasync function HandleAllEvent(context) {\r\n  \u002F\u002F ...\r\n}\r\n\r\nfunction App() {\r\n  return router([slack.event('*', HandleAllEvent)]);\r\n}\r\n```\r\n\r\n- [fix] fix `context.views.open` in slack home tab (#809)\r\n- [fix] fix route slack event (#841)\r\n- [fix] fix slack session when channel id is null (#802)\r\n- [docs] update slack routes improvement (#759)\r\n- [example] example: slack update and delete (#769)\r\n- [example] slack home tab (#829)\r\n- [example] slack modal on home (#827)\r\n- [example] slack modal update (#825)\r\n- [example] slack modal form (#828)\r\n\r\n## dialogflow\r\n\r\n- [deps] use `@google-cloud\u002Fdialogflow` v4\r\n\r\n## create-bottender-app\r\n\r\n- [fix] fix context concat and env name (#859)\r\n\r\n## bottender-facebook\r\n\r\n- [new] add new connector - `FacebookConnector` to experiment using same connector for Messenger and Facebook.\r\n\r\n```js\r\n\u002F\u002F bottender.config.js\r\nconst { FacebookConnector } = require('@bottender\u002Ffacebook');\r\n\r\nmodule.exports = {\r\n  channels: {\r\n    facebook: {\r\n      enabled: true,\r\n      path: '\u002Fw","2021-09-13T18:52:22",{"id":182,"version":183,"summary_zh":184,"released_at":185},101120,"v1.4.12","## create-bottender-app\r\n\r\n- [fix] fix context concat and env name #859","2020-08-25T08:20:44",{"id":187,"version":188,"summary_zh":189,"released_at":190},101121,"v1.4.11","## dialogflow\r\n\r\n- [fix] use for await instead of `promise.all` #851\r\n","2020-07-29T09:24:30",{"id":192,"version":193,"summary_zh":194,"released_at":195},101122,"v1.4.10","- [fix] add Interaction type for route `slack.event` (#842)\r\n","2020-07-28T17:20:13",{"id":197,"version":198,"summary_zh":199,"released_at":200},101123,"v1.4.9","\r\n- [fix] MongoSessionStore: enable `useUnifiedTopology` to avoid warning (#831)","2020-07-07T06:42:53",{"id":202,"version":203,"summary_zh":204,"released_at":205},101124,"v1.4.8","- [fix] lock messaging-apis packages on a specific version.\r\n","2020-06-30T03:00:14",{"id":207,"version":208,"summary_zh":209,"released_at":210},101125,"v1.4.7","- [fix] add a workaround to support express behind trust proxies (for example: nginx) with:\r\n\r\n```js\r\nserver.enable('trust proxy');\r\n\r\n\u002F\u002F or\r\nserver.set('trust proxy', true);\r\n```","2020-06-23T04:04:25",{"id":212,"version":213,"summary_zh":214,"released_at":215},101126,"v1.4.6","## messenger\r\n\r\n- [fix] cli: remove deprecated properties on messenger profiles (including `home_url`).","2020-05-22T15:07:10",{"id":217,"version":218,"summary_zh":219,"released_at":220},101127,"v1.4.5","- [fix] fix issue #618 ngrok undefined error message (#765)\r\n","2020-05-11T06:49:36",{"id":222,"version":223,"summary_zh":224,"released_at":225},101128,"v1.4.4","## slack\r\n\r\n- [fix] convert slack interactive message event to camelcase (#755).","2020-05-06T08:38:20",{"id":227,"version":228,"summary_zh":229,"released_at":230},101129,"v1.4.3","- [type] use string instead enum to compare.\r\n","2020-04-29T06:45:50",{"id":232,"version":233,"summary_zh":234,"released_at":235},101130,"1.4.2","- [type] improve TS types of the `getClient` function (#744)\r\n","2020-04-24T07:32:01",{"id":237,"version":238,"summary_zh":239,"released_at":240},101131,"v1.4.1","## line\r\n\r\n- [fix] bump messaging-api-line to beta.20 and fix types in text methods (#742)","2020-04-17T07:25:31",{"id":242,"version":243,"summary_zh":244,"released_at":245},101132,"v1.4.0","- [new] route: provides `namespace.any` for better readability (#719):\r\n\r\n```js\r\nfunction App() {\r\n  return router([\r\n    messenger.any(HandleMessenger),\r\n    line.any(HandleLine),\r\n    slack.any(HandleSlack),\r\n    telegram.any(HandleTelegram),\r\n    viber.any(HandleViber),\r\n    whatsapp.any(HandleWhatsapp),\r\n  ]);\r\n}\r\n```\r\n\r\n- [new] support custom session store (#732):\r\n\r\n```js\r\n\u002F\u002F bottender.config.js\r\n\r\nconst { MemorySessionStore } = require('bottender');\r\n\r\nmodule.exports = {\r\n  session: {\r\n    driver: 'memory2',\r\n    stores: {\r\n      memory2: new MemorySessionStore();\r\n    },\r\n  },\r\n};\r\n```\r\n\r\n- [fix] context: let getters return literal instead of string type (#724)\r\n- [type] improve types of withProps (#731)\r\n\r\n## messenger\r\n\r\n- [new] messenger: use v6.0 graph api as default (messaging-apis#556)\r\n- [new] support reaction event and routing (#718):\r\n\r\nSupport `event.isReaction` & `event.react`:\r\n\r\n```js\r\nfunction App(context) {\r\n  if (context.event.isReaction) {\r\n    console.log(context.event.reaction);\r\n    \u002F\u002F {\r\n    \u002F\u002F   reaction: 'smile',\r\n    \u002F\u002F   emoji: '\\u{2764}\\u{FE0F}',\r\n    \u002F\u002F   action: 'react',\r\n    \u002F\u002F   mid: 'mid.$cAAE1UUyiiwthh0NPrVbVf4HFNDGl',\r\n    \u002F\u002F  }\r\n  }\r\n}\r\n```\r\n\r\nSupport detect events in routers:\r\n\r\n```js\r\nconst { router, messenger } = require('bottender\u002Frouter');\r\n\r\nfunction App() {\r\n  return router([\r\n    messenger.reaction.react(HandleReactionReact),\r\n    messenger.reaction.unreact(HandleReactionUnreact),\r\n    messenger.reaction(HandleReaction),\r\n  ]);\r\n}\r\n\r\nasync function HandleReactionReact(context) {}\r\nasync function HandleReactionUnreact(context) {}\r\nasync function HandleReaction(context) {}\r\n```\r\n\r\n- [new] add `context.sendOneTimeNotifReqTemplate` (#722):\r\n\r\n```js\r\ncontext.sendOneTimeNotifReqTemplate({\r\n  title: '\u003CTITLE_TEXT>',\r\n  payload: '\u003CUSER_DEFINED_PAYLOAD>',\r\n});\r\n```\r\n\r\n- [type] improve types of MessengerContext send methods (#729)\r\n\r\n## line\r\n\r\n- [new] export `LineNotify` (#721):\r\n\r\n```js\r\nconst { LineNotify } = require('bottender');\r\n```\r\n\r\n- [type] add `language` to `User` (messaging-apis#563)\r\n- [type] add `sticon` to `TextMessage` (messaging-apis#564)\r\n- [type] export LINE flex types (messaging-apis#558)\r\n\r\n## bottender-dialogflow\r\n\r\n- [new] support text responses filled on Dialogflow.\r\n\r\n## create-bottender-app\r\n\r\n- [new] add `lib` es2018-es2020 by default.\r\n- [fix] let `App` action accept Action as return value (#734)","2020-04-15T10:43:24",{"id":247,"version":248,"summary_zh":249,"released_at":250},101133,"v0.15.18","### line\r\n\r\n- [deps] bump `messaging-api-line` to 0.7.18 to support LINE domain changes.","2020-04-08T06:29:05",{"id":252,"version":253,"summary_zh":254,"released_at":255},101134,"v1.3.5","- [fix] put `router.d.ts` into package files whitelist","2020-04-04T13:13:18"]