OpenClaw智能体流量镜像重构:插件化设计与性能优化实践
1. 项目缘起一次“意外”的流量镜像需求最近在折腾一个基于OpenClaw的智能体项目想给它加个“监控眼”——把智能体对外部服务的所有请求也就是Outbound Session都镜像一份方便后续做日志审计、性能分析或者故障复盘。这听起来是个挺常见的需求对吧很多微服务框架里都有类似的功能。但当我真正动手去实现时才发现OpenClaw现有的Outbound Session Mirroring机制用起来有点“别扭”。这个别扭感主要来自于它的设计。现有的镜像逻辑和核心的会话处理、路由解析代码耦合得比较紧像是后期硬塞进去的一个功能。每次我想调整镜像的目标地址或者过滤掉某些不需要镜像的请求比如健康检查都得去动那些核心的业务逻辑代码。这就像你想给汽车装个行车记录仪结果发现必须拆开发动机才能接线不仅风险高而且每次调整记录仪设置都得大动干戈。更麻烦的是由于缺乏清晰的抽象镜像过程中的数据我们称之为“会话键”和“路由解析结果”传递也变得晦涩难懂一旦镜像链路出问题排查起来如同大海捞针。所以我决定动手重构它。目标很明确把镜像功能从一个“嵌入式插件”变成一个“可插拔的组件”。让核心的会话流转和路由解析逻辑保持干净、专注而镜像行为则通过一套清晰的接口和配置来驱动。这样无论是切换镜像存储后端从本地文件到Kafka还是动态调整镜像策略都可以在不触及核心业务代码的情况下完成。这次重构本质上是对OpenClaw流量治理能力的一次深度解耦和增强。2. 重构核心会话键与路由解析的独立与抽象要理解这次重构必须先搞明白两个核心概念会话键Session Key和路由解析Route Resolution。在旧的实现里这两者是散落在各个处理函数里的“隐式知识”而在新架构里它们被提炼成了显式的、可管理的对象。2.1 会话键为每一次对话贴上唯一标签想象一下OpenClaw智能体同时处理着来自飞书、微信和网页端的多个用户对话。当它需要调用一个外部API比如查询天气时我们怎么知道这个调用是属于哪个对话的呢这就需要“会话键”。在重构前这个键可能由几个变量临时拼接而成比如user_id channel timestamp逻辑分散且不易维护。重构后我定义了一个专门的SessionKey类或结构体。它的生成逻辑被集中管理class SessionKey: def __init__(self, session_id: str, source: str, timestamp: int): self.session_id session_id # 全局唯一的会话ID self.source source # 请求来源如 feishu, wechat self.timestamp timestamp # 会话开始时间戳 def to_string(self) - str: 将会话键序列化为字符串用于日志或作为存储键 return f{self.source}:{self.session_id}:{self.timestamp} classmethod def from_request(cls, request_context: dict) - SessionKey: 从请求上下文中提取信息构建会话键 # 这里是一个示例逻辑实际从request_context的headers或body中解析 session_id request_context.get(session_id, default) source request_context.get(source, unknown) timestamp int(time.time() * 1000) # 毫秒时间戳 return cls(session_id, source, timestamp)为什么这么做集中管理会话键的生成保证了全局唯一性和一致性。无论后续的镜像逻辑如何变化只要它拿到一个SessionKey对象就能准确追溯到源头会话。这为后续的链路追踪、会话归档打下了坚实基础。在实操中一个常见的坑是不同渠道的session_id格式可能不同有的带前缀有的是纯UUID。我建议在from_request方法里做一次标准化清洗比如统一去除前缀确保键的格式稳定。2.2 路由解析从意图到行动的清晰地图当用户对OpenClaw说“帮我订一张明天去北京的机票”智能体需要理解这个意图并决定调用哪个外部服务比如“机票预订API”。这个过程就是路由解析。旧代码里路由逻辑和具体的API调用、错误处理搅在一起。重构后我将路由解析抽离成一个独立的Router模块。它的输入是用户的意图经过NLU处理后的结构化数据输出是一个Route对象class Route: def __init__(self, endpoint: str, method: str, payload_template: dict, timeout_ms: int): self.endpoint endpoint # 目标API地址如 https://api.flight.com/book self.method method # HTTP方法 POST self.payload_template payload_template # 请求体模板 self.timeout_ms timeout_ms # 超时时间 class Router: def resolve(self, intent: dict, session_key: SessionKey) - Route: 根据意图和会话上下文解析出具体的路由信息。 这里可以集成规则引擎或简单的配置映射。 intent_name intent.get(name) # 示例从配置文件中加载路由表 route_config self._load_route_config().get(intent_name) if not route_config: raise RouteNotFoundException(fNo route found for intent: {intent_name}) # 动态填充模板中的变量例如将用户语句中的“北京”填入模板 filled_payload self._fill_template(route_config[payload_template], intent[slots]) return Route( endpointroute_config[endpoint], methodroute_config[method], payload_templatefilled_payload, timeout_msroute_config.get(timeout, 5000) )路由解析独立化的价值可测试性Router可以单独进行单元测试用不同的意图输入验证其输出是否正确而不需要启动整个OpenClaw服务。可扩展性未来如果想引入更复杂的路由策略比如基于用户等级的灰度路由、A/B测试只需要修改或替换Router的实现业务逻辑无需变动。镜像前置在真正发起外部调用之前我们就已经得到了清晰的Route对象。这意味著我们可以在这个“决策点”就将会话键和路由信息发送给镜像模块实现真正的“事前镜像”而不是在请求发出后才去捞数据。3. 全新镜像模块设计插件化与策略分离有了独立的会话键和路由解析构建新的镜像模块就水到渠成了。核心思想是镜像是一个监听者Observer而不是一个参与者。它订阅核心流程中发出的事件然后异步地、非阻塞地处理这些事件。3.1 定义清晰的事件与接口我定义了一个OutboundSessionEvent事件类它包含了镜像所需的所有信息from dataclasses import dataclass from typing import Any, Dict dataclass class OutboundSessionEvent: 出站会话镜像事件 session_key: SessionKey route: Route request_payload: Dict[str, Any] # 实际要发送的请求数据 timestamp: int event_type: str REQUEST # 也可以是 RESPONSE, ERROR然后定义一个镜像处理器接口MirroringHandlerfrom abc import ABC, abstractmethod class MirroringHandler(ABC): 镜像处理器抽象基类 abstractmethod async def handle(self, event: OutboundSessionEvent) - None: 处理镜像事件。必须是异步的避免阻塞主流程。 pass abstractmethod def can_handle(self, event: OutboundSessionEvent) - bool: 判断该处理器是否应该处理此事件用于实现过滤策略。 pass3.2 实现多种具体的处理器基于这个接口我们可以轻松实现各种处理器日志文件处理器将事件以JSON格式写入本地文件。Kafka处理器将事件发送到Kafka消息队列供下游的流处理系统消费。调试处理器只在特定调试模式下启用将事件打印到控制台。过滤处理器可以组合使用例如忽略所有对/health端点的请求镜像。一个Kafka处理器的简单示例import json from kafka import KafkaProducer class KafkaMirroringHandler(MirroringHandler): def __init__(self, bootstrap_servers: str, topic: str): self.producer KafkaProducer( bootstrap_serversbootstrap_servers, value_serializerlambda v: json.dumps(v).encode(utf-8) ) self.topic topic def can_handle(self, event: OutboundSessionEvent) - bool: # 这里可以添加过滤逻辑例如只镜像某些来源的请求 return event.session_key.source in [feishu, wechat] async def handle(self, event: OutboundSessionEvent) - None: if not self.can_handle(event): return # 将事件对象转换为可序列化的字典 message { session_key: event.session_key.to_string(), endpoint: event.route.endpoint, method: event.route.method, payload: event.request_payload, timestamp: event.timestamp } # 异步发送到Kafka future self.producer.send(self.topic, valuemessage) # 通常这里不会同步等待但可以添加回调处理发送失败的情况 # future.add_callback(self._on_send_success).add_errback(self._on_send_error)3.3 核心流程的集成轻量级事件发射现在OpenClaw处理Outbound Session的核心流程变得非常干净class OpenClawSessionProcessor: def __init__(self, router: Router, mirroring_handlers: List[MirroringHandler]): self.router router self.mirroring_handlers mirroring_handlers async def process_outbound_request(self, intent: dict, request_context: dict): 处理出站请求的核心流程 # 1. 生成会话键 session_key SessionKey.from_request(request_context) # 2. 路由解析 route self.router.resolve(intent, session_key) # 3. 构建最终请求载荷这里可能结合session_key和route的模板 final_payload self._build_final_payload(route, intent, session_key) # 4. **触发镜像事件非阻塞** mirror_event OutboundSessionEvent( session_keysession_key, routeroute, request_payloadfinal_payload, timestampint(time.time() * 1000) ) # 异步通知所有处理器 asyncio.gather(*[h.handle(mirror_event) for h in self.mirroring_handlers]) # 5. 执行真正的HTTP请求镜像不影响主流程 try: response await self._http_client.request( methodroute.method, urlroute.endpoint, jsonfinal_payload, timeoutroute.timeout_ms / 1000 ) # 如果需要也可以触发一个 RESPONSE 类型的镜像事件 return response except Exception as e: # 触发一个 ERROR 类型的镜像事件 # ... raise关键改进点非阻塞使用asyncio.gather异步触发镜像处理即使某个镜像处理器如网络存储较慢也不会拖慢主请求的响应速度。可配置mirroring_handlers可以在服务启动时通过配置文件加载实现插件的热插拔。职责清晰核心流程只负责生成事件至于事件如何处理完全由外部处理器决定。4. 配置化与动态策略管理重构的另一个重要目标是让镜像行为变得可配置、可动态调整。我们不再需要修改代码来改变镜像逻辑。4.1 基于YAML的声明式配置我设计了一个配置文件mirroring_config.yamlmirroring: enabled: true handlers: - type: file config: path: /var/log/openclaw/mirror.log format: json - type: kafka config: bootstrap_servers: kafka-broker1:9092,kafka-broker2:9092 topic: openclaw-outbound-sessions # 过滤器只镜像来自飞书且访问特定端点的请求 filters: - field: session_key.source operator: equals value: feishu - field: route.endpoint operator: contains value: /api/v1/order - type: debug_console config: enabled: {{ DEBUG_MODE }} # 支持从环境变量动态读取服务启动时一个配置加载器会解析这个YAML文件利用反射机制动态实例化对应的MirroringHandler对象并注入配置参数。4.2 动态策略与过滤链配置文件中的filters项非常强大。我实现了一个简单的过滤链引擎。每个事件在被处理器处理前都会经过这个过滤链的评估。class Filter: def __init__(self, field: str, operator: str, value: Any): self.field field # 例如 session_key.source self.operator operator # equals, contains, regex self.value value def evaluate(self, event: OutboundSessionEvent) - bool: # 通过反射从event对象中获取字段值 field_value self._get_nested_field(event, self.field) if self.operator equals: return field_value self.value elif self.operator contains: return self.value in str(field_value) # ... 其他操作符 return True class FilterChain: def __init__(self, filters: List[Filter], logic: str AND): # logic 可以是 AND 或 OR self.filters filters self.logic logic def allows(self, event: OutboundSessionEvent) - bool: if not self.filters: return True results [f.evaluate(event) for f in self.filters] if self.logic AND: return all(results) else: return any(results)这样运维人员或开发者只需要修改配置文件就可以实现诸如“只镜像生产环境来自微信的支付请求”、“忽略所有对测试端点的调用”等复杂策略无需重启服务如果结合配置中心。5. 实战踩坑与性能优化心得重构过程并非一帆风顺这里分享几个关键的踩坑点和优化经验。5.1 事件序列化的性能陷阱最初我直接把整个OutboundSessionEvent对象包含request_payload传递给处理器。request_payload可能很大比如包含Base64编码的图片。当多个处理器同时处理时内存复制和序列化的开销巨大。解决方案引入“懒加载”或“引用传递”概念。对于可能很大的request_payload在OutboundSessionEvent中只存储其引用如一个唯一ID或内存地址或者存储一个可调用的函数只有当处理器真正需要时比如写入文件前才去获取完整的载荷数据。对于Kafka处理器可以采用更高效的二进制序列化协议如Avro、Protobuf而不是JSON。dataclass class OutboundSessionEvent: session_key: SessionKey route: Route # 改为一个可调用对象延迟获取实际数据 payload_getter: Callable[[], Dict[str, Any]] timestamp: int event_type: str REQUEST # 在核心流程中 mirror_event OutboundSessionEvent( session_keysession_key, routeroute, payload_getterlambda: final_payload, # 只是一个引用不立即复制数据 timestampint(time.time() * 1000) )5.2 异步处理中的错误隔离与降级所有镜像处理器都是异步执行的但如果某个处理器抛出了未捕获的异常默认情况下asyncio.gather会传播这个异常可能会意外中断主流程吗实际上gather的return_exceptionsTrue参数可以防止异常扩散但我们需要更精细的控制。解决方案为每个处理器包装一个安全的执行上下文。async def safe_handle(handler: MirroringHandler, event: OutboundSessionEvent): try: if handler.can_handle(event): await handler.handle(event) except Exception as e: # 在这里记录严重的镜像失败日志但不要影响其他处理器和主流程 logging.error(fMirroring handler {type(handler).__name__} failed: {e}, exc_infoTrue) # 可选触发一个降级操作比如将失败事件存入一个死信队列或本地缓存 # 在核心流程中 mirror_tasks [safe_handle(h, mirror_event) for h in self.mirroring_handlers] await asyncio.gather(*mirror_tasks) # 即使某个task内部出错gather也会正常完成同时为关键的业务镜像处理器如Kafka实现一个简单的本地磁盘队列作为降级方案。当网络或Kafka不可用时先将事件写入本地文件待服务恢复后再重放。5.3 会话键的全局唯一性保障在分布式部署OpenClaw时多个实例可能同时生成会话键。如果单纯使用timestamp极有可能出现冲突。虽然冲突对镜像本身可能影响不大但对基于会话键的追踪和聚合分析是灾难性的。解决方案在SessionKey中引入机器标识符和序列号。可以使用雪花算法Snowflake的思路或者直接使用UUID v4。在OpenClaw的上下文中如果已经有一个全局唯一的会话ID通常由上游网关或客户端生成那么直接使用它是最佳选择。我的经验是在SessionKey.from_request方法中优先寻找请求中携带的全局ID如X-Request-ID如果没有再使用“机器IP进程PID自增序列”的组合来生成一个确保在分布式环境下的唯一性。6. 重构后的价值与扩展想象完成这次重构后整个Outbound Session Mirroring的体验焕然一新。对开发者的价值维护性镜像逻辑与业务代码分离修改镜像策略无需理解复杂的会话处理流程。可测试性Router和各个MirroringHandler都可以进行独立的单元测试和集成测试。可观测性结构化的镜像数据配合ELK或时序数据库可以轻松搭建出站请求的全景监控仪表盘实时观察不同外部服务的响应延迟、成功率。对运维和业务人员的价值灵活性通过修改配置文件可以快速调整镜像策略满足临时的审计或调试需求。扩展性想要新增一个镜像目的地比如Elasticsearch只需要实现一个新的MirroringHandler并在配置文件中添加一行即可。未来的扩展想象动态采样可以在FilterChain中实现采样率配置只镜像1%的流量在高并发场景下大幅降低存储和计算开销。敏感信息脱敏可以创建一个专门的SanitizingHandler在处理事件前自动将payload中的密码、身份证号等字段替换为***满足数据安全合规要求。与OpenClaw Skill系统集成可以将镜像事件本身暴露为一个“事件源”允许其他Skill订阅这些事件从而开发出“异常调用告警”、“API调用成本分析”等高级技能。这次重构让我深刻体会到一个好的架构不仅是让代码跑起来更是让变化容易发生。将Outbound Session Mirroring重构为一个插件化、配置化的组件就像为OpenClaw装上了一双可以灵活调整视角的“眼睛”不仅看得清还能根据不同的场景切换不同的滤镜为智能体的稳定运行和深度优化提供了坚实的数据基础。

相关新闻

OpenClaw ACP Agents架构解析:从多智能体协同到生产部署实战

OpenClaw ACP Agents架构解析:从多智能体协同到生产部署实战

1. 项目概述:为什么OpenClaw的ACP Agents值得深挖?最近在折腾AI智能体(Agents)的朋友,估计没少被OpenClaw这个名字刷屏。特别是它核心的ACP Agents实现机制,几乎成了社区里讨论的焦点。我花了将近一个月的时…

2026/8/26 14:04:11 阅读更多 →
从零实现OpenClaw与飞书深度集成:打造企业级AI智能体协同办公方案

从零实现OpenClaw与飞书深度集成:打造企业级AI智能体协同办公方案

1. 项目概述:为什么要把OpenClaw和飞书绑在一起? 最近在折腾AI智能体(Agent)的朋友,估计没少听OpenClaw这个名字。它本质上是一个开源的AI智能体框架,你可以把它理解为一个“大脑调度中心”。它本身不产生…

2026/8/26 15:51:42 阅读更多 →
智能体技能自我进化:从静态编排到动态学习的工程实践

智能体技能自我进化:从静态编排到动态学习的工程实践

1. 项目概述:从“手动编排”到“自我进化”的智能体革命如果你和我一样,曾经为了一个智能体(Agent)项目,在深夜对着YAML配置文件、Python脚本和API文档“手动编排”技能逻辑,那么“Hermes Agent 如何让 Ope…

2026/8/26 13:25:02 阅读更多 →

最新新闻

1.10 C++踩坑排雷手册——union 的类型活跃状态:读取非活跃成员为未定义行为

1.10 C++踩坑排雷手册——union 的类型活跃状态:读取非活跃成员为未定义行为

1.10 C++实战100例——union的类型活跃状态:读取非活跃成员为未定义行为 受众 中级工程师,已掌握 union 的基本语法,能区分 C 风格 union 与 C++ 的活跃成员概念。默认具备基础 Linux 操作能力和 GDB 调试能力。 场景锚定 场景:你在 C++ 代码中定义了一个 union 包含 i…

2026/8/26 20:05:46 阅读更多 →
Vibe Coding AI编程方法集 -- 编程新范式

Vibe Coding AI编程方法集 -- 编程新范式

Vibe编程探索AI时代编程新范式——范文杰等1. 从命令到意图 意图式编程的本质变化体现在以下几点。 聚焦目标而非路径:开发由 “怎么做” 转向 “要达成什么”。抽象能力提升:意图可沉淀为复用模块,跨团队共享。协作语言统一:业务…

2026/8/26 20:05:46 阅读更多 →
直接传递给视频AI的文本结构:类似json字符串结构自然语言

直接传递给视频AI的文本结构:类似json字符串结构自然语言

比如:视频时长:10s 视频内容:xxxxxxx 视频要求:xxxxxxxx 视频素材:xxxxxxxx我觉得他的优点是:1 表达非常清晰,几乎没有歧义2 文字简洁,没有废话,应该可以提高AI生成的质量3 固定结构,使用非常方…

2026/8/26 20:05:46 阅读更多 →
DroidCam OBS插件设置项深度解析:分辨率、H.264与硬件加速的7个关键选项

DroidCam OBS插件设置项深度解析:分辨率、H.264与硬件加速的7个关键选项

DroidCam OBS插件设置项深度解析:分辨率、H.264与硬件加速的7个关键选项 【免费下载链接】droidcam-obs-plugin DroidCam OBS Source 项目地址: https://gitcode.com/gh_mirrors/dr/droidcam-obs-plugin DroidCam OBS插件(droidcam-obs-plugin&am…

2026/8/26 20:05:45 阅读更多 →
如何快速上手 ip-location-zh:一行 composer 命令,即刻获取 IP 省市与行政区划代码

如何快速上手 ip-location-zh:一行 composer 命令,即刻获取 IP 省市与行政区划代码

如何快速上手 ip-location-zh:一行 composer 命令,即刻获取 IP 省市与行政区划代码 【免费下载链接】ip-location-zh 获取 IP 地址的真实地理位置 项目地址: https://gitcode.com/gh_mirrors/ip/ip-location-zh ip-location-zh 是一个免费的 PHP …

2026/8/26 20:04:45 阅读更多 →
MySQL8 Docker容器化部署之x86-64架构(含备份)

MySQL8 Docker容器化部署之x86-64架构(含备份)

一、 简介 本文介绍如何在 x86-64 架构的服务器上安装并配置MySQL8,涵盖目录规划、镜像拉取、容器启动与数据备份等关键步骤,帮助读者快速完成生产可用的部署。 二、详解 1. 创建目录 创建安装目录、数据目录与备份目录。 >> mkdir -p /opt/softwa…

2026/8/26 20:04:45 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →