新闻详情

新闻详情

首页 / 资讯中心 / 详情

AI Agent运行可视化:从JSON日志到像素风实时监控面板

发布时间:2026/9/30 4:44:03来源:尧图网络
AI Agent运行可视化:从JSON日志到像素风实时监控面板
从本地日志里捞线索这事我真是干够了。前阵子我在本地跑 OpenClaw给这只“龙虾”Agent 安排了一堆日常任务整理报价单、起草客户回复、汇总周报素材。任务一多终端里的 JSON Lines 日志就像瀑布一样往下刷——Event 一条接一条乍一看全是有效信息可一旦它卡在某个工具调用上或者两个任务抢同一个会话文件日志并不会第一时间告诉你“我不行了”。有一次它因为session file locked (timeout 60000ms)卡了好几分钟我盯着终端愣是没发现异常直到最后agent failed before reply蹦出来才意识到出事了。从那一刻起我想明白了Agent 运行时不缺日志缺的是仪表盘。所以我给它搭了一间像素办公室——用一个复古味十足的小界面实时展示这只龙虾眼下在忙什么、卡在哪、有没有翻车。这篇文章就是这次折腾的完整记录包括事件流解析、状态机设计、像素角色画法以及若干血泪排查经验。适合正在跑 OpenClaw 或其他 Agent 框架、也想把运行状态可视化的朋友参考。1. 为什么给 Agent 搭一间“办公室”1.1 Agent 跑起来之后最难受的是“黑盒感”先说场景。我本地的 OpenClaw 负责好几个并行的任务流比如“整理这周的报价单并起草给客户的回复”。这种任务拆开来看大概是检索邮件 → 打开报价文件 → 汇总关键字段 → 生成回复草稿 → 自查格式。每一步在日志里都能找到对应的记录可问题是日志是给人“事后考古”用的不是给人“实时感知”用的。真实的日志长这样{ts:2025-01-10T08:11:02.412Z,event:tool_call,agent:claw,tool:web_search,input:客户A 最新报价} {ts:2025-01-10T08:11:27.901Z,event:tool_result,agent:claw,tool:web_search,output:找到了3条相关报价} {ts:2025-01-10T08:12:05.133Z,event:message,agent:claw,session:tasks/quote-42,text:正在汇总报价信息}单看一条不觉得有什么但连续跑一晚上之后你根本不可能逐行去盯。更麻烦的是很多问题不是“有报错”而是“没进展”——比如 tool_call 发出去之后 tool_result 迟迟不来或者会话文件被另一个任务锁住日志里早早就写了锁等待你却没往那边看。这次触发我做面板的直接原因就是锁问题。日志里出现了这么一行{ts:2025-01-10T09:30:44.102Z,event:error,agent:claw,session:tasks/quote-42,message:openclaw agent failed before reply: session file locked (timeout 60000ms)}看到agent failed before reply的时候任务其实已经凉了。我翻了半天日志才拼出完整经过两个任务同时想写同一个会话文件后到的那个等了 60 秒拿不到锁直接放弃回复。这种事靠 grep 日志也不是不能查但它本应该在一开始就被我看见——而不是等任务失败了我才去翻。1.2 面板的目标不是“替代日志”而是“一眼看懂状态”我给自己定的设计目标很简单实时性事件从发生到出现在面板上延迟不超过 1 秒。可读性不用读文字扫一眼颜色和动作就能判断 Agent 是在干活、在等待还是已经出错。低侵入绝对不改 OpenClaw 源码只在外面读它的日志。可扩展以后加第二个 Agent、第三个任务队列不用推翻重来。打个比方日志相当于机场广播每一条都在告诉你发生了什么面板相当于航班大屏你不需要听完整条广播抬头看一眼就知道该去哪个登机口、哪趟航班延误了、哪个航班已经取消。我要做的就是给 OpenClaw 装一块“航班大屏”。1.3 像素办公室的布局每个元素都有对应含义既然要做“一眼看懂”我就放弃了传统 Dashboard 的折线图和柱状图改成了一间像素办公室。每个视觉元素都绑定一个运行状态像素元素对应含义视觉反馈办公桌当前正在执行的主任务桌上有文件跳动时表示 working沙发队列中等待的任务沙发上的角色处于 waiting轻微缩放档案柜记忆检索 / 知识库访问柜门闪烁表示 memory_read/write咖啡机工具调用流水线每触发一次 tool_call咖啡机亮一下公告板最近事件时间线滚动显示最近 50 条归一化事件状态灯Agent 整体健康度绿色正常黄色等待红色 error比如那只像素龙虾坐在办公桌前桌上文件在跳说明它正在干活档案柜一闪说明它在翻历史记忆如果它整个红掉并剧烈闪烁那就说明出错了——比如刚才那个session file locked。2. 方案选型事件流、独立解析进程与像素渲染2.1 整体架构只有三层确定了目标之后架构其实非常直白。OpenClaw 的日志是落盘的 JSON Lines 文件我只需要做三件事读日志、归一化事件、推送到前端渲染。完整链路如下数据层OpenClaw 运行目录下的agent.jsonl日志文件所有 Agent 事件都追加在这里。解析层一个独立的 Python 进程持续读取日志尾部把每一行 JSON 解析成统一事件结构再通过 WebSocket 推给浏览器。展示层纯 HTML CSS 原生 JavaScript 页面收到事件后刷新像素办公室里的角色状态、公告板和状态灯。这个架构的优点是没有中间件依赖。不需要消息队列不需要数据库实时性靠 WebSocket 就够了。2.2 为什么要把日志解析单独拆成一个进程我最开始想过直接让浏览器去读日志文件但 Web 页面没有这个权限也跨域。后来又想在前端直接连 OpenClaw 的进程级日志流可 OpenClaw 官方的日志输出格式在不同版本里有些差异直接耦合风险太高。把它拆成独立进程有几点实际好处第一不影响 OpenClaw 本身。我只是用只读方式打开日志文件不碰任何会话状态Agent 该干嘛干嘛。第二解析逻辑可以单独测试。我可以随便造几条 JSON 日志喂给解析器看它怎么归一化不用反复重启 OpenClaw。第三以后可以横向扩展。如果我有三只“龙虾”跑在不同的机器上每台机器起一个收集器把事件汇总到一个面板就行。数据流只有单向日志文件 → 解析器 → WebSocket → 页面。永远不要反过来让页面去控制 Agent。2.3 事件类型梳理面板上到底要展示哪些东西要做到“一眼看懂”得先把 OpenClaw 可能产生的事件分类。我翻了实际日志后梳理出这些核心类型事件类型含义面板动作task_started新任务开始办公桌区域出现任务标签task_completed任务正常结束任务标签移入“已完成”状态灯闪绿tool_call调用工具咖啡机亮起公告板新增条目tool_result工具返回结果办公桌文件更新等待结束messageAgent 输出文本消息公告板滚动显示消息摘要memory_read读取记忆/知识库档案柜闪烁memory_write写入新记忆档案柜高亮旧知识被更新session_locked会话文件被锁状态灯变黄角色进入 waitingsession_unlocked会话锁释放状态灯恢复绿error任务失败/异常角色变红公告板标红可外发告警这个分类不需要很“学术”关键是能对应到操作层面的判断它是卡住了、在跑、还是在等我介入。比如session_locked出现时我至少知道任务在等资源不是死机了。而error出现时尤其是匹配到timeout 60000ms这种关键词我就要人工介入。3. 事件数据模型与核心解析逻辑3.1 统一事件结构先定字段再写代码OpenClaw 的原始日志字段名比较随意不同版本里event和type混用的情况也有。所以我在解析层做了一道“归一化”统一输出下面的结构{ ts: 2025-01-10T09:30:44.102Z, agent: claw, type: session_locked, session: tasks/quote-42, detail: { message: openclaw agent failed before reply: session file locked (timeout 60000ms), tool: , input: , output: } }字段含义ts事件时间统一成 ISO 8601排序和展示都方便。agentAgent 标识。OpenClaw 默认是claw加新的龙虾时这个字段用来区分谁在干活。type归一化后的事件类型对应上一章的九类。session所属任务/会话 ID用来跟踪同一个任务的完整生命周期。detail原始日志里的具体信息保留 message、tool、input、output 等字段备用。统一结构最关键的价值是前端只需要处理一套 schema。类型映射写死到解析器里页面代码就不会被日志格式的变动反复折腾。3.2 日志解析器的核心实现解析器的核心是一个跟随文件尾部追加的函数。Linux 下最简单的实现思路是记录文件当前读取位置offset每次循环尝试读一行读不到就 sleep 一会儿再试同时处理日志轮转详见后面第 6 章。下面是一段可用的 Python 解析器核心逻辑import asyncio import json from pathlib import Path LOG_PATH Path.home() / .openclaw / logs / agent.jsonl OFFSET_PATH Path(/tmp/openclaw_events_offset) TYPE_ALIASES { tool_call: tool_call, tool_result: tool_result, message: message, session_locked: session_locked, session_unlocked: session_unlocked, error: error, } def normalize(raw: dict) - dict: t TYPE_ALIASES.get(raw.get(event, raw.get(type, )), message) return { ts: raw.get(ts, ), agent: raw.get(agent, claw), type: t, session: raw.get(session, ), detail: { message: raw.get(message, ), tool: raw.get(tool, ), input: raw.get(input, ), output: raw.get(output, ), }, } async def follow_and_emit(handler): offset 0 if OFFSET_PATH.exists(): offset int(OFFSET_PATH.read_text()) with open(LOG_PATH, r, encodingutf-8) as fp: fp.seek(offset) while True: line fp.readline() if line: line line.strip() if line: try: raw json.loads(line) evt normalize(raw) await handler(evt) except json.JSONDecodeError: print([warn] skip malformed line:, line[:80]) offset fp.tell() OFFSET_PATH.write_text(str(offset)) else: await asyncio.sleep(0.5)这个函数只做一件事跟着日志文件尾部把每一行解析成统一事件后交给上层 handler。handler 可以是“推送 WebSocket”也可以是“打印到控制台”。这样解析器本身很容易测试。有一点要注意OpenClaw 日志的编码问题。最好用encodingutf-8显式指定不然在中文 Windows 环境下可能读取乱码。3.3 session file locked 到底是怎么回事这是这次踩坑最深的点单独拿出来说一下。OpenClaw 的每个会话都对应一个 session 文件Agent 在“开口说话”之前要先拿到这个文件的锁避免多个任务同时写入把上下文写乱。如果一个会话被某个任务占用着另一个任务也想用就得等锁释放默认超时是 60 秒拿不到就直接放弃于是就有了那句session file locked (timeout 60000ms)。你可以把它理解成办公室只有一间会议室两个团队都要用先到的人不开完会后到的人要么等要么取消。这个机制本身没问题问题是日志里它长得太普通了混在一堆事件里根本不显眼。在面板里我把这类事件专门做了两个处理第一把session_locked映射为黄色等待状态角色不再显示为“正在工作”而是进入等待动画提醒我“它在等资源”。第二如果紧接着出现agent failed before reply或error就把状态灯直接刷红公告板里这一条也标红。说句实话真正解决锁问题还是得从 OpenClaw 的调度侧入手比如检查是不是重复提交了同一个任务或者多个实例并发指向同一个会话目录。但面板至少能做到第一时间告诉我“别再傻等了去查一下”。4. 像素办公室的渲染实现4.1 渲染技术选型为什么没上 Canvas像素风最容易想到的是 Canvas 或者 PixiJS 这类游戏渲染方案。但我最后还是选了 HTML CSS Grid SVG 原生 JavaScript。原因很简单这个面板的主题是状态展示不是游戏画面。角色动画只有几种固定状态——呼吸、闪烁、轻微位移CSS 动画完全可以胜任。DOM 方案的好处还在于事件公告板天然就是文本列表用createElement插入即可没必要为了这点交互引入游戏框架。另外像素角色我用的是 CSSbox-shadow逐点绘制好处是只用一段样式就能描述一个像素图案不需要额外加载图片资源离线也能跑。缺点是大尺寸像素图会让样式变得很长所以我把角色控制在了 8x8 像素网格。举个例子一只简化的龙虾头可以这样画.pixel { width: 8px; height: 8px; box-shadow: 8px 0 0 #ff7f50, 16px 0 0 #ff7f50, 8px 8px 0 #d9480f, 16px 8px 0 #d9480f, 8px 16px 0 #ff7f50, 16px 16px 0 #ff7f50; }每一组x y 0 颜色就代表一个像素点。实际写的时候我会用一个二维数组定义图案再用脚本生成这段box-shadow避免手写几百行。4.2 Agent 状态机从事件类型到视觉反馈状态机是整个前端的大脑。我把每个 Agent 抽象成四个状态状态触发条件动画表现idle无活动事件原地站立呼吸灯缓慢变亮变暗working收到 task_started / tool_call角色上下小幅跳动办公桌文件标签晃动waiting收到 session_locked或长时间无 tool_result角色缩放循环状态灯变黄error收到 error 事件角色亮红色闪烁频率加快代码上我只维护一个setState函数所有事件都通过它改变状态function setAgentState(agent, state) { const el document.getElementById(agent- agent); if (!el) return; el.dataset.state state; el.classList.remove(state-idle, state-working, state-waiting, state-error); el.classList.add(state- state); const statusLight document.getElementById(light- agent); if (statusLight) { const lightMap { idle: green, working: green, waiting: yellow, error: red }; statusLight.style.background lightMap[state]; } }这里有个细节状态切换不要“见风就是雨”。一次 tool_call 过来就让角色从 idle 跳到 working 没问题但如果每一条消息都改状态反而会闪烁得像霓虹灯。所以我在事件处理那一层做了一次合并当一个持续期很短的 tool_call 和紧跟其后的 tool_result 在几百毫秒内连续到达时状态保持 working 不变直到任务真正结束或异常出现。4.3 事件带来的动画公告板和时间线条目公告板是像素办公室的“消息流”。我每收到一个事件就往公告板顶部插入一条新记录最多保留 50 条。为了避免 DOM 操作太频繁我用了一个队列配合requestAnimationFrame统一刷新let eventQueue []; let rafId null; function enqueueEvent(evt) { eventQueue.push(evt); if (rafId null) { rafId requestAnimationFrame(flushEvents); } } function flushEvents() { while (eventQueue.length) { const evt eventQueue.shift(); appendTimeline(evt); updateScene(evt); } rafId null; }这样即使 OpenClaw 一瞬间刷出几十条 tool_call页面也不会被一次几十个 DOM 插入打崩。像素办公室毕竟主打“氛围感”我并没有把很细的字段都铺在屏幕上。公告板每条只展示三样东西时间、Agent 名称、事件摘要。想看完整原始日志还是去终端里翻。5. 完整实操从零跑通一个可复现的监控面板5.1 准备工作确认 OpenClaw 日志路径先把环境捋清楚。我的运行环境是 LinuxOpenClaw 默认把运行日志写到用户目录下ls -l ~/.openclaw/logs/agent.jsonl如果日志文件存在随手tail一下看看内容tail -f ~/.openclaw/logs/agent.jsonl能看到 JSON Lines 格式的事件输出就可以开始下一步。如果 path 不同后面所有命令和代码里的路径都要换成你实际的。这一步花不了两分钟但能省掉后面一半的排查时间。5.2 后端事件服务一个可运行的 server.py下面的代码是一个完整可运行的后端实现了两件事跟随日志文件并把归一化事件通过 WebSocket 广播给所有连接的浏览器同时托管静态页面。我用的是websockets库先装依赖pip install websockets然后保存server.py#!/usr/bin/env python3 import asyncio import argparse import json from pathlib import Path from http import HTTPStatus import websockets CONNECTIONS set() async def broadcast(evt: dict): data json.dumps(evt, ensure_asciiFalse) dead [] for ws in CONNECTIONS: try: await ws.send(data) except Exception: dead.append(ws) for ws in dead: CONNECTIONS.remove(ws) async def handler(ws): CONNECTIONS.add(ws) try: await ws.wait_closed() finally: CONNECTIONS.discard(ws) async def main(log_path: Path, port: int): async with websockets.serve(handler, 127.0.0.1, port): print(fWebSocket server on ws://127.0.0.1:{port}) offset 0 with open(log_path, r, encodingutf-8) as fp: fp.seek(offset) while True: line fp.readline() if line: line line.strip() if line: try: raw json.loads(line) evt normalize(raw) await broadcast(evt) except json.JSONDecodeError: print([warn] skip malformed line:, line[:80]) offset fp.tell() else: await asyncio.sleep(0.5) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--path, defaultstr(Path.home() / .openclaw / logs / agent.jsonl)) parser.add_argument(--port, typeint, default8765) args parser.parse_args() asyncio.run(main(Path(args.path), args.port))这个版本省略了normalize函数实际用的时候把第 3 章那段normalize拿过来拼上即可。5.3 前端页面index.html 的核心逻辑页面我保持得比较克制只有一个场景容器、一个公告板和一个状态灯区域。核心结构如下div idscene div idagents div classagent idagent-claw div classpixel-agent/div div classagent-nameclaw/div /div /div div idfurniture div classprop desk-label办公桌/div div classprop archive-label档案柜/div div classprop coffee-label咖啡机/div /div div idlight-claw classstatus-light/div /div div idtimeline/div前端的 JavaScript 连上 WebSocket 后根据事件类型调用不同更新函数const ws new WebSocket(ws://127.0.0.1:8765); ws.onmessage (event) { const evt JSON.parse(event.data); enqueueEvent(evt); }; function updateScene(evt) { const el document.getElementById(agent- evt.agent); if (!el) return; if (evt.type session_locked) setAgentState(evt.agent, waiting); else if (evt.type error) setAgentState(evt.agent, error); else if (evt.type task_started || evt.type tool_call) setAgentState(evt.agent, working); else if (evt.type task_completed || evt.type tool_result) setAgentState(evt.agent, idle); }样式方面像素角色用box-shadow生成状态颜色靠>python3 server.py --path ~/.openclaw/logs/agent.jsonl --port 8765然后在浏览器里打开http://127.0.0.1:8765因为我只起了 WebSocket没起 HTTP 静态服务实际演示时可以用python3 -m http.server单独开一个端口或者直接把 index.html 拖进浏览器里配合 WebSocket 地址调试。验证我推荐做两件事第一往日志里手动追加一条模拟事件echo {ts:2025-01-12T10:00:00Z,event:tool_call,tool:web_search,agent:claw,session:test-1} ~/.openclaw/logs/agent.jsonl这时公告板应该立刻出现一条 tool_call咖啡机图标闪一下角色进入 working。第二追加一条session_locked事件echo {ts:2025-01-12T10:00:05Z,event:error,message:openclaw agent failed before reply: session file locked (timeout 60000ms),agent:claw,session:test-1} ~/.openclaw/logs/agent.jsonl状态灯应变黄或变红角色进入 error 状态。这两条一发整条链路就通了。6. 常见问题与排查实录6.1 事件风暴OpenClaw 一瞬间输出几十条日志真实跑任务时tool_call 和 tool_result 经常是连续出现的。尤其是一次检索任务可能触发好几轮搜索WebSocket 一次会推过来一堆数据。如果前端每条消息都立刻操作 DOM页面会明显卡顿。我的解决思路是两层第一层在后端做节流。如果同一session在 100 毫秒内出现了超过 10 条事件就把它们合并成一条“批量事件”。第二层在前端做批量渲染也就是第 4 章提到的requestAnimationFrame队列。事件先入队每一帧只处理一次保证 UI 节奏稳定。实测下来单只 Agent 跑满负载时CPU 占用基本可以忽略。6.2 日志文件被轮转或者被清空OpenClaw 的日志也可能被 logrotate 清理。收集器持有的 offset 一旦超过文件当前大小再继续fp.readline()就会读不到新内容看起来像面板卡死。处理办法是每次循环读完一行后检查文件大小和当前 offset 的关系size open_log_path.stat().st_size if size offset: offset 0 print([info] log rotated, reset offset to 0)重置 offset 之后如果日志文件已经重建就从头开始读新文件。这里有个取舍重置到 0 会把当前文件里已有的事件再播一遍如果 OpenClaw 刚启动日志里往往是空文件问题不大如果文件很大重放会有一阵子“刷屏”但不会卡死。6.3 状态闪烁和误报早期版本里我只要收到 error 事件就把角色标红结果发现 OpenClaw 有些错误其实是可恢复的比如单次工具调用超时后它会重试并不代表整个 Agent 挂了。面板一晚上闪红好几次到最后我都麻木了。后来加了两条规则同一 session 里连续 3 次 error 才把角色切换到 error 状态。同一个session_locked错误5 分钟内只在公告板播报一次避免同一个锁错误刷满整个公告板。这样面板反应的是“真实需要人工介入”的异常而不是每一次抖动。6.4 把面板事件接到 Teams 和 Obsidian面板本身是本地可视化的但实际使用中我经常不在电脑前。所以我在事件服务上加了一个可选的转发层当收到agent failed before reply这类严重错误时往 Microsoft Teams 的 Webhook 发一条消息。实现很简单在broadcast之前加一个判断if evt[type] error: await post_to_teams(evt)post_to_teams本质就是一次 POST JSON 请求Teams 的 Webhook 会把它渲染成一条卡片消息。这样人在手机旁边也能收到异常通知。另外我还写了个定时脚本每天深夜把当天的归一化事件汇总成 Markdown 文件丢进 Obsidian 的 vault 里。这样每天早上一打开 Obsidian就能看到昨天的“Agent 工作日报”谁执行了什么任务、哪次失败了、失败原因是什么全都有据可查。等于像素办公室负责实时Obsidian 负责复盘。最后再分享几个实际使用中的体会做完这个像素办公室之后我最直观的感受是我不再像以前那样每隔几分钟就切到终端刷一次日志了。面板放在副屏上扫一眼就知道 Claw 是在查资料、在写回复、在等锁还是已经翻车。screen也好tmux也好那些东西适合服务端管理但不适合给人做状态感知。再分享一个小技巧给日志目录做了软链把agent.jsonl同步到一台局域网 NAS 上面板读的路径指向 NAS 文件。这样我人在客厅用手机连家里的 Wi-Fi也能打开同一个面板看 Agent 状态不用非得蹲在电脑前面。最后提醒一句可视化的目的是让异常暴露得更快而不是让页面变得花哨。先把“是否一眼能看到异常”这个核心问题解决掉再去纠结像素画得够不够精致。像session file locked (timeout 60000ms)这种坑搭配面板后我从“任务失败后翻日志复盘”变成了“任务刚卡住就介入抢救”体验是质变级的。如果你也在跑 OpenClaw 或者其他 Agent 框架不妨照这个思路先做一版简单的跑起来之后再慢慢加细节。
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

DeepSeek法律文档摘要:抽象式生成与效力校验实战 2026/9/30 6:36:54

DeepSeek法律文档摘要:抽象式生成与效力校验实战

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

阅读更多 →
Codex-X 结构化长文起草模板解析:把零散材料组织成重点明确、论证连贯的完整初稿 2026/9/30 6:36:35

Codex-X 结构化长文起草模板解析:把零散材料组织成重点明确、论证连贯的完整初稿

桌面应用开发者工具AI 应用 【免费下载链接】Codex-X OpenAI Codex 桌面端/CLI 的可视化管理工具,具有Provider/API 切换、会话同步、提示词注入、Skills/MCP 管理、TOML 配置可视化的跨平台工具。 项目地址: https://gitcode.com/GitHub_Trending/co/Co…

阅读更多 →
DouK-Downloader 完整指南:免费批量下载抖音作品、采集评论与直播录制,一篇讲透 2026/9/30 6:36:35

DouK-Downloader 完整指南:免费批量下载抖音作品、采集评论与直播录制,一篇讲透

DouK-Downloader 完整指南:免费批量下载抖音作品、采集评论与直播录制,一篇讲透 【免费下载链接】TikTokDownloader 抖音 / TikTok 平台作品下载/数据采集工具 项目地址: https://gitcode.com/GitHub_Trending/ti/TikTokDownloader DouK-Download…

阅读更多 →
欧盟排放交易体系指令 2003/87/EC 深度解读:EU ETS 的制度架构、配额分配与合规机制(截至 2023 年修订版) 2026/9/30 6:36:35

欧盟排放交易体系指令 2003/87/EC 深度解读:EU ETS 的制度架构、配额分配与合规机制(截至 2023 年修订版)

示例工程 【免费下载链接】GenAI_Agents 50 tutorials and implementations for Generative AI Agent techniques, from basic conversational bots to complex multi-agent systems. 项目地址: https://gitcode.com/GitHub_Trending/ge/GenAI_Agents 点击查看 免费…

阅读更多 →
XLeRobot $660 低成本视觉机器人实操指南:YOLO + 逆运动学让机械臂看见并抓住目标 2026/9/30 6:36:34

XLeRobot $660 低成本视觉机器人实操指南:YOLO + 逆运动学让机械臂看见并抓住目标

XLeRobot $660 低成本视觉机器人实操指南:YOLO 逆运动学让机械臂看见并抓住目标 【免费下载链接】XLeRobot XLeRobot: Practical Dual-Arm Mobile Home Robot for $660 项目地址: https://gitcode.com/GitHub_Trending/xl/XLeRobot XLeRobot 是一台约 $660 …

阅读更多 →
HowToCook 冷吃兔全流程实战:自贡盐帮菜的香料配比、油温控制与量化烹饪指南 2026/9/30 6:36:34

HowToCook 冷吃兔全流程实战:自贡盐帮菜的香料配比、油温控制与量化烹饪指南

文档教程 【免费下载链接】HowToCook Programmers guide about how to cook at home. 项目地址: https://gitcode.com/GitHub_Trending/ho/HowToCook 点击查看 免费下载 本篇以 HowToCook 开源菜谱仓库中的 冷吃兔.md 为核心,系统拆解四川自贡盐帮菜&qu…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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