OpenClaw插件实战:基于Pub/Sub与Events API实现Google Chat AI智能体集成

news2026/5/7 5:43:21
1. 项目概述最近在折腾一个挺有意思的东西叫teyou/openclaw-googlechatpubsub-plugin。简单来说这是一个为 OpenClaw 这个 AI 智能体平台开发的插件它的核心功能是让 AI 智能体能够无缝接入 Google Chat谷歌聊天的工作空间。这玩意儿解决了一个挺实际的痛点以前你想让 AI 机器人参与群聊通常得在消息里 它它才会响应。但这个插件通过 Google Workspace Events API 和 Cloud Pub/Sub 的组合拳实现了对指定聊天空间里所有消息的监听AI 可以像一位沉默但全知的参与者一样随时根据内容做出反应完全不需要手动提醒。我自己在团队协作里试过不少工具发现这种“无感集成”的模式特别适合需要 AI 辅助决策或信息处理的场景。比如在一个产品讨论群里你可以配置一个“技术顾问”智能体当大家聊到某个技术关键词时它就能自动介入提供代码建议或架构分析同时再配置一个“会议纪要官”智能体让它监听所有对话自动提炼会议要点。这比手动 机器人要自然高效得多。这个插件目前还处于 Alpha 阶段v0.2.0但根据官方说明和一些社区反馈已经能在生产环境稳定运行了只是后续 API 可能会有调整。如果你正在寻找一种将 AI 深度融入 Google Workspace 日常沟通流的方法这个项目值得你花时间深入研究一下。2. 核心原理与架构设计拆解2.1 为什么是 Pub/Sub Events API传统的聊天机器人集成无论是 Slack、Discord 还是早期的 Google Chat大多采用 Webhook 或长轮询Long Polling的方式。Webhook 需要你有一个公网可访问的服务器来接收回调对个人开发者或内网环境不友好长轮询则可能带来延迟和资源消耗。这个插件选择 Google Cloud Pub/Sub 作为消息中转层是一个相当优雅的解决方案。Pub/Sub 的核心价值在于解耦和可靠性。Workspace Events API 将 Google Chat 空间中发生的事件如新消息作为“消息”发布Publish到一个指定的 Pub/Sub Topic 中。我们的插件则作为“订阅者”Subscriber从这个 Topic 拉取Pull消息。这样做有几个明显好处缓冲与削峰即使你的 AI 处理服务暂时不可用或处理速度慢消息也会安全地堆积在 Pub/Sub 中不会丢失。可扩展性你可以部署多个插件实例同时处理同一个订阅实现负载均衡虽然插件目前设计为单实例运行。简化权限插件只需要关注从 Pub/Sub 拉取数据和调用 Chat API 回复无需暴露一个公网 HTTP 端点安全性更高。Workspace Events API是关键触发器。它允许你订阅特定 Google Chat 空间的事件流。一旦订阅建立该空间内任何新消息都会触发一个事件并被推送到你绑定的 Pub/Sub Topic。这个过程是近乎实时的避免了轮询带来的延迟。2.2 插件内部工作流详解插件内部的处理流程是一个清晰的管道Pipeline我们可以把它拆解为四个核心阶段轮询Poll插件以可配置的间隔默认3秒向 Pub/Sub 订阅发起拉取请求。这是整个流程的起点。过滤Filter并非所有拉取到的消息都需要处理。插件会进行初步过滤例如忽略机器人自己发送的消息防止循环回复以及根据配置判断该消息是否属于需要监听的聊天空间。路由Route这是多智能体协同的核心。插件根据每条消息的内容和预定义的规则决定将其路由给哪个或哪几个 OpenClaw 智能体。规则主要有两种alwaysListen始终监听和mentionKeyword关键词触发。路由逻辑支持去重确保一个消息不会重复发送给同一个智能体。管道处理Pipeline消息被路由到具体的智能体后会进入 OpenClaw 的智能体处理管道。智能体根据其预设的指令Instruction、知识库和工具来决定如何响应。处理完成后插件会代表该智能体通过 Google Chat API 将回复发送回原聊天空间或指定的线程中。这个架构确保了从消息接收、智能分发到 AI 处理、最终回复的整个链路是高效且可控的。2.3 线程与会话隔离的设计哲学插件在回复行为上提供了精细的控制主要体现在“线程回复”和“会话隔离”两个维度。replyInThread选项决定了回复的位置。如果设置为false回复会直接出现在聊天空间的主时间线里。如果设置为true那么针对某条消息的首次回复会创建一个新线程后续所有关于这个话题的对话包括用户的追问和 AI 的再回复都会在这个线程内进行。强烈建议在生产环境设置为true。这样做的好处是保持主空间整洁避免 AI 的冗长回复刷屏干扰人类对话。话题聚焦相关讨论被限制在线程内上下文更清晰。符合现代聊天工具的使用习惯类似于 Slack 的线程功能。threadSessionIsolation选项则更深一层它控制了 AI 的“记忆”范围。当设置为true时每个 Google Chat 线程都会对应一个独立的 OpenClaw 会话Session。这意味着AI 智能体在这个线程里产生的对话历史、上下文记忆完全与其他线程和主空间隔离。这非常适合处理并行的、主题独立的讨论。例如线程 A 在讨论数据库设计线程 B 在讨论 UI bug两个线程中的 AI 互不干扰各自维护上下文。如果设置为false那么整个聊天空间包括所有线程将共享一个会话AI 可能会把不同线程的对话历史混淆在一起。这个选项的默认值巧妙地与replyInThread联动如果开启了线程回复则默认开启会话隔离这是一个非常合理的默认设置。3. 从零开始的完整部署与配置实战3.1 环境与前提条件 Checklist在动手之前请确保你已满足以下所有条件任何一个缺失都可能导致后续步骤失败OpenClaw 网关确保你正在运行 OpenClaw 网关并且版本在 v0.23 或以上。你可以通过openclaw --version命令检查。Google 工作空间账号你需要一个 Google Workspace 账号企业或教育版普通的个人 Gmail 账号无法使用 Workspace Events API。Google Cloud Platform (GCP) 项目创建一个新的或使用现有的 GCP 项目并确保已启用结算功能即使使用免费配额也需要关联有效的支付方式。Google Chat 应用机器人你需要在 Google Chat API 中配置好一个机器人应用并为其创建一个服务账号Service Account。这个机器人将是消息的发送者身份。空间成员身份用于 OAuth 授权的用户账号就是你用来登录并同意授权那个账号必须是你打算让机器人监听的每一个 Google Chat 空间的成员。否则订阅事件时会收到 403 权限错误。3.2 GCP 侧关键配置步步解析这一步是整个流程中最容易出错的地方需要仔细操作。3.2.1 启用必要 API进入 GCP 控制台 在库中搜索并启用以下两个 APICloud Pub/Sub API这是消息队列的核心。Google Workspace Events API这是事件源的触发器。3.2.2 创建 Pub/Sub 主题与订阅你可以通过控制台图形界面操作但使用gcloud命令行工具更清晰可重现# 创建主题 gcloud pubsub topics create openclaw-chat-events # 创建订阅 gcloud pubsub subscriptions create openclaw-chat-events-sub \ --topicopenclaw-chat-events这里有个极其关键的权限配置你必须允许 Google Chat 的事件推送服务账号向这个主题发布消息。执行以下命令gcloud pubsub topics add-iam-policy-binding openclaw-chat-events \ --memberserviceAccount:chat-api-pushsystem.gserviceaccount.com \ --roleroles/pubsub.publisher如果遗漏这一步Workspace Events API 将无法把聊天消息推送到你的主题导致插件收不到任何消息。3.2.3 配置 OAuth 同意屏幕与凭据OAuth 同意屏幕进入“API 和服务” - “OAuth 同意屏幕”。选择用户类型为“内部”如果你在组织内使用或“外部”。填写应用名称如“OpenClaw Bot”、用户支持邮箱等。在“范围”部分手动添加以下四个范围https://www.googleapis.com/auth/chat.messages(读写消息已包含只读权限)https://www.googleapis.com/auth/chat.spaces.readonly(读取空间信息)https://www.googleapis.com/auth/chat.messages.reactions(添加表情反应)https://www.googleapis.com/auth/pubsub(管理 Pub/Sub) 务必一次性添加全否则后续需要重新授权。创建 OAuth 客户端 ID在“凭据”页面创建新的 OAuth 2.0 客户端 ID。应用类型选择“Web 应用”。在“已获授权的重定向 URI”中添加http://localhost:3000/oauth/callback。创建后下载 JSON 文件保存好其中的client_id和client_secret。3.2.4 获取 OAuth 访问令牌这是手动但必要的一步用于获取初始的刷新令牌Refresh Token。构造授权 URL替换YOUR_CLIENT_IDhttps://accounts.google.com/o/oauth2/v2/auth?client_idYOUR_CLIENT_IDredirect_urihttp://localhost:3000/oauth/callbackresponse_typecodescopehttps://www.googleapis.com/auth/chat.messageshttps://www.googleapis.com/auth/chat.spaces.readonlyhttps://www.googleapis.com/auth/chat.messages.reactionshttps://www.googleapis.com/auth/pubsubaccess_typeofflinepromptconsent在浏览器中访问此 URL使用你的 Workspace 账号登录并授权。授权后浏览器会重定向到一个localhost地址可能无法打开但重点是从地址栏的 URL 中复制出code后面的参数值即授权码。然后使用 curl 命令交换令牌curl -s -X POST https://oauth2.googleapis.com/token \ -d codeYOUR_AUTH_CODE \ -d client_idYOUR_CLIENT_ID \ -d client_secretYOUR_CLIENT_SECRET \ -d redirect_urihttp://localhost:3000/oauth/callback \ -d grant_typeauthorization_code | python3 -m json.tool ~/gchat-tokens.json成功后会生成一个gchat-tokens.json文件里面包含了access_token和至关重要的refresh_token。插件将使用这个文件自动管理令牌刷新。3.2.5 获取 Google Chat 空间 ID你需要知道要监听哪个空间。打开 Google Chat 网页版进入目标空间。查看浏览器地址栏URL 通常有两种格式https://chat.google.com/room/ABC123example- 空间 ID 为spaces/ABC123examplehttps://mail.google.com/mail/u/0/#chat/space/ABC123example- 空间 ID 同样为spaces/ABC123example记录下这个完整的spaces/...字符串。3.3 插件安装与 OpenClaw 配置3.3.1 安装插件推荐使用 npm 方式安装这是最简洁的方法openclaw plugins install teyou/openclaw-googlechatpubsub安装后插件会自动注册到你的 OpenClaw 网关。3.3.2 编辑 OpenClaw 主配置文件接下来是核心配置环节你需要编辑 OpenClaw 的配置文件通常是~/.openclaw/openclaw.json。配置分为三个部分插件允许列表、频道配置、智能体绑定路由。{ // 第一部分声明允许使用的插件 plugins: { allow: [googlechatpubsub] // 确保插件名在此数组中 }, // 第二部分配置 googlechatpubsub 频道 channels: { googlechatpubsub: { enabled: true, projectId: your-gcp-project-id-123456, // 你的GCP项目ID topicId: openclaw-chat-events, // 之前创建的Pub/Sub主题名 subscriptionId: openclaw-chat-events-sub, // 之前创建的订阅名 pollIntervalSeconds: 3, renewalBufferMinutes: 30, oauth: { clientId: YOUR_OAUTH_CLIENT_ID.apps.googleusercontent.com, clientSecret: YOUR_OAUTH_CLIENT_SECRET, tokensFile: /home/your-username/gchat-tokens.json // 上一步生成的令牌文件绝对路径 }, bindings: [ // 定义监听哪个空间以及如何路由 { space: spaces/ABC123example, // 替换为你的空间ID replyInThread: true, // 强烈建议设为true threadSessionIsolation: true, // 默认与replyInThread一致 agents: [ // 在此空间内定义多个智能体及其触发规则 { agentId: chief-of-staff, alwaysListen: true }, // 总助理监听所有消息 { agentId: engineer, mentionKeyword: eng }, // 工程师当消息包含“eng”时触发 { agentId: designer, mentionKeyword: design } // 设计师触发词“design” ] } // 你可以添加更多 bindings 来监听其他空间 ] } }, // 第三部分将频道收到的消息路由到具体的智能体会话 bindings: [ { agentId: chief-of-staff, match: { channel: googlechatpubsub, accountId: chief-of-staff // 此处的 accountId 必须与上面 agents[].agentId 对应 } }, { agentId: engineer, match: { channel: googlechatpubsub, accountId: engineer } }, { agentId: designer, match: { channel: googlechatpubsub, accountId: designer } } ] }3.3.3 重启网关并验证保存配置文件后重启 OpenClaw 网关以使配置生效openclaw gateway restart重启后通过以下命令检查插件是否成功加载openclaw plugins list你应该能在列表中看到googlechatpubsub插件。同时检查网关日志通常通过openclaw gateway logs或查看系统日志确认插件启动过程中没有报错并且打印出了成功连接到 Pub/Sub 以及创建/更新了 Workspace 事件订阅的日志信息。4. 多智能体路由策略与实战场景模拟配置中的agents数组是发挥插件威力的关键。它允许你在同一个聊天空间内部署多个各司其职的 AI 智能体通过不同的策略触发实现协同工作。4.1 路由规则逻辑深度解析路由决策遵循一个清晰的优先级和组合逻辑alwaysListen: true这是最高优先级的规则。任何标记为alwaysListen的智能体无论消息内容是什么都会收到该消息的一份副本。这通常用于配置一个“全局助理”或“记录员”角色。mentionKeyword: keyword这是条件触发规则。插件会对消息文本进行不区分大小写的包含性匹配。如果消息中含有指定的关键词则对应的智能体会被加入接收者列表。去重合并如果一个智能体既被alwaysListen规则选中又因为消息包含其关键词而被选中它只会被加入列表一次避免重复处理。并行处理消息会被同时发送给所有匹配的智能体。各个智能体的处理管道是独立的它们可以同时生成回复。插件会将这些回复依次发送回聊天室。4.2 典型场景配置示例与消息流向假设我们配置了如前文所示的三个智能体chief-of-staff(总助始终监听)、engineer(工程师关键词“eng”)、designer(设计师关键词“design”)。下面用一个表格来模拟不同消息内容下的路由结果用户发送的消息路由到的智能体行为解释“大家早上好今天天气不错。”chief-of-staff消息不含任何关键词只有alwaysListen的智能体响应。总助可能会礼貌性回复或者根据其指令选择忽略此类问候。“张三eng帮忙看看这段代码的性能问题。”chief-of-staff,engineer消息包含关键词“eng”因此engineer被触发。chief-of-staff因始终监听而同样接收。工程师会分析代码总助可能也会基于对话上下文提供一些总结。“我们需要为新产品设计一个logodesign 你有什么灵感”chief-of-staff,designer关键词“design”触发设计师智能体。总助同样在场。设计师会提供设计思路总助可能协助整理需求点。“eng 和 design请一起评估一下这个新功能的可行性明天给我报告。”chief-of-staff,engineer,designer消息同时包含“eng”和“design”两者都被触发。加上总助三个智能体都会收到消息。他们可能会在各自的处理中侧重不同方面最终回复可能来自三者形成一个综合性的讨论。这种设计极大地增强了灵活性。你可以让一个“会议秘书”智能体始终监听并总结所有对话让“代码专家”只在提到技术栈时介入让“客服助手”在用户提到“帮助”或“问题”时自动提供支持文档。所有这一切都在后台自动完成无需用户改变他们自然的聊天习惯。4.3 高级路由技巧与注意事项关键词选择选择具有区分度、不易在普通对话中出现的词作为关键词。避免使用“的”、“是”、“你好”等常见词。可以考虑使用团队内部约定的特殊前缀如“/ask-eng:”。智能体指令设计路由只是第一步智能体如何回应取决于其在 OpenClaw 中的“指令”Instruction。对于alwaysListen的智能体其指令应包含明确的过滤逻辑例如“你是一个沉默的记录员只有当对话涉及项目决策点时才进行简要总结并列出待办事项其他日常聊天无需回复。” 否则它可能会对每句话都回复造成刷屏。处理冲突如果多个智能体被触发且都进行了回复它们的回复会按处理完成的顺序发送。这可能看起来有点乱。可以考虑在智能体指令中加入协作逻辑例如“如果你检测到消息也触发了其他专家智能体请在你的回复开头注明你的专业领域以便用户区分。”性能考量消息会并行发送给所有匹配的智能体。如果你的智能体处理逻辑非常复杂或调用昂贵的外部API需要评估同时触发多个智能体时的资源消耗和响应时间。可以在插件配置中调整agentTimeoutSeconds来设置单个智能体处理的超时时间。5. 生产环境运维与深度故障排查指南将这套系统用于实际团队协作后你会遇到一些在测试中不明显的问题。下面是我在实际部署和运维中积累的一些关键经验和排查思路。5.1 订阅管理与生命周期监控Workspace Events API 的订阅有一个4小时的有效期TTL。这是 Google 出于安全考虑的设计。插件的auto-renewing subscriptions功能就是为了解决这个问题。它会定期在到期前renewalBufferMinutes分钟默认30分钟检查并续订订阅。你需要关注的是状态持久化文件插件将订阅状态保存在~/.openclaw/gchat-pubsub-subscription-state.json。如果这个文件损坏或丢失插件在重启后可能会尝试创建重复的订阅导致错误。定期备份这个文件是个好习惯。日志监控确保你的日志系统能捕获到插件的日志。重点关注包含“renewing subscription”或“subscription expired”字样的日志条目。如果续订失败插件会尝试重新创建订阅但前提是 OAuth 令牌依然有效。renewalBufferMinutes设置默认30分钟是合理的。不建议设置得太小如5分钟以免产生不必要的 API 调用也不建议设置得太大如接近240分钟以免续订请求因网络波动失败后没有重试缓冲时间。5.2 常见故障现象与根因分析下表整理了部署和运行中最可能遇到的问题、其根本原因及解决方案故障现象可能原因与排查步骤插件未在openclaw plugins list中显示1.安装失败重新运行openclaw plugins install命令查看错误输出。2.配置未允许检查openclaw.json中plugins.allow数组是否包含googlechatpubsub。3.版本不兼容确认 OpenClaw 网关版本 ≥ v0.23。网关日志显示“Failed to create/watch subscription”或 403/404 错误1.空间成员身份这是最常见的原因。用于 OAuth 授权的用户账号不是目标 Google Chat 空间的成员。请将该账号加入空间。2.API 未启用再次确认 GCP 项目中Google Workspace Events API和Cloud Pub/Sub API已启用。3.OAuth 范围不足令牌文件 (gchat-tokens.json) 是在缺少必要范围的情况下获取的。需要撤销应用授权并在 GCP OAuth 同意屏幕重新添加所有必需范围然后重新执行授权流程获取新令牌。收不到任何聊天消息1.Pub/Sub 权限缺失检查是否执行了add-iam-policy-binding命令授予chat-api-pushsystem.gserviceaccount.com发布者权限。这是关键一步。2.订阅名称不匹配检查配置文件中的subscriptionId是否与 GCP 中创建的订阅名称完全一致。3.项目ID错误检查projectId是否正确。4.空间ID错误检查bindings[].space的值是否正确必须是spaces/开头的完整格式。机器人能收到消息但不回复1.智能体路由失败检查 OpenClaw 配置的第二部分bindings路由绑定确保accountId与频道配置中的agentId能正确对应。2.智能体自身问题消息已路由到智能体但智能体处理失败或未定义回复。查看 OpenClaw 的智能体日志或测试智能体在其他频道是否正常工作。3.Chat API 权限确认 OAuth 范围包含了https://www.googleapis.com/auth/chat.messages而不仅仅是只读。机器人回复时出现 403 错误1.反应ReactionAPI 范围如果错误与添加表情反应如 有关是因为缺少chat.messages.reactions范围。需要重新授权。2.令牌失效访问令牌过期且刷新令牌也失效了。插件应自动刷新但如果刷新令牌被撤销如在 GCP 控制台重置了客户端密钥则需要重新进行 OAuth 授权流程获取新的令牌文件。同一条消息被回复了多次1.重复的插件进程确保没有意外启动多个 OpenClaw 网关实例或插件进程。检查系统进程列表。2.绑定配置重复检查openclaw.json的channels.googlechatpubsub.bindings和全局bindings是否有重复或冲突的条目。5.3 性能调优与稳定性建议调整轮询间隔 (pollIntervalSeconds)默认3秒对于大多数团队聊天场景是及时的。如果消息量极大可以适当降低如1秒以减少延迟但会增加 Pub/Sub API 的调用次数。如果消息量很小可以调高如10秒以节省资源。智能体超时 (agentTimeoutSeconds)默认60秒。如果某个智能体处理复杂任务如调用外部慢速API可能超时。可以根据智能体的最坏情况处理时间调整此值。超时后该智能体的本次处理会被终止不会发送回复。资源隔离与监控由于插件在 OpenClaw 网关进程内运行智能体的繁重处理会占用网关资源。建议为不同的智能体配置资源限制并监控网关所在服务器的 CPU、内存使用情况。日志聚合将 OpenClaw 网关和插件的日志接入统一的日志聚合系统如 ELK、Loki便于追踪消息从接收、路由、处理到回复的完整链路快速定位瓶颈或错误。灰度发布首次在重要团队空间部署时可以先配置alwaysListen为一个仅记录日志但不实际回复的“影子”智能体观察其行为是否符合预期再逐步引入会主动回复的智能体。6. 安全、权限与最佳实践总结在企业环境中集成此类自动化工具安全和权限管理是重中之重。6.1 权限最小化原则OAuth 范围只申请必要的范围。本插件所需的四个范围是功能实现的最低要求不要随意扩大。GCP 服务账号用于创建 Pub/Sub 主题和订阅的账号应遵循最小权限原则。除了项目所有者/编辑者角色外可以创建自定义角色仅包含 Pub/Sub 管理员和 Workspace Events 订阅创建所需的权限。Google Chat 机器人身份这个机器人将以服务账号的身份在聊天室中活动。确保它只被添加到需要其工作的空间并告知空间成员其功能和监听范围。6.2 配置安全管理令牌文件 (gchat-tokens.json)此文件包含可刷新长期访问权限的refresh_token必须妥善保管。将其存储在服务器安全的目录设置严格的文件权限如600并确保不在版本控制系统如 Git中提交此文件。客户端密钥 (client_secret)同样需要保密。虽然它被嵌入在openclaw.json配置中但也应确保配置文件本身的访问权限。配置文件分离考虑将敏感的配置项如oauth字段抽取到环境变量或外部加密配置文件中通过${ENV_VAR}的方式在openclaw.json中引用。6.3 运营与治理最佳实践明确的团队告知在部署 AI 机器人到团队聊天空间前务必向所有成员明确告知机器人的存在、其监听规则例如“它会监听所有消息但只在被关键词触发或作为记录员时回应”、数据处理方式消息是否会发送到外部 AI 服务以及如何临时禁用或反馈问题。设置关键词前缀为了避免误触发可以要求团队成员在需要 AI 介入时使用统一的前缀例如“/ai-eng: 如何优化查询”。然后在插件配置中将关键词设置为“/ai-eng”。这能减少日常聊天中的意外触发。实现监管审计智能体可以创建一个拥有特殊权限的alwaysListen智能体其指令是分析所有对话和 AI 回复检测是否有不当内容、泄露敏感信息或违反公司政策的情况并将摘要发送给管理员。这提供了另一层安全保障。定期审查日志定期检查智能体的回复日志评估其回复质量和准确性。根据反馈持续优化智能体的指令和知识库。制定降级和禁用流程当插件或 AI 服务出现异常时应有快速禁用机器人的方案。最简单的方式是在配置中将enabled改为false并重启网关。更优雅的方式可以设计一个特殊的“停机”关键词触发一个执行禁用操作的智能体。这个插件为 OpenClaw 打开了一扇通往 Google Workspace 实时协作场景的大门。它的价值不在于替代人类沟通而在于作为一位不知疲倦的、知识渊博的协作者在后台提供即时支持。从技术实现上看它巧妙地利用了 Google Cloud 的托管服务来处理可靠性问题自身则专注于业务逻辑的路由和集成设计非常清晰。在实际使用中最大的挑战往往不在技术部署而在于如何设计智能体的职责和交互规则使其真正融入团队工作流提升效率而非造成干扰。这需要不断的迭代和团队磨合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2590541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…